VirtualBox

Changeset 3042 in kBuild


Ignore:
Timestamp:
May 11, 2017 10:23:12 AM (8 years ago)
Author:
bird
Message:

kWorker: Fixed failure 43 (42+1) problem when running built tools from the kBuild output dirs. Implmented base image TLS support and added a _beginthreadex hack for VCC120. The TLS stuff needs more work, probably.

Location:
trunk/src/kWorker
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kWorker/Makefile.kmk

    r2968 r3042  
    153153
    154154
     155#
     156# A couple of dummy DLLs we use for grabbing LDR TLS entries.
     157#
     158DLLS += kWorkerTls1K kWorkerTls64K kWorkerTls512K
     159kWorkerTls1K_TEMPLATE   = BIN-STATIC-THREADED
     160kWorkerTls1K_DEFS       = KWORKER_BASE=0x10000 TLS_SIZE=1024
     161kWorkerTls1K_SOURCES    = kWorkerTlsXxxK.c
     162kWorkerTls1K_LDFLAGS    = /Entry:DummyDllEntry
     163
     164kWorkerTls64K_TEMPLATE  = BIN-STATIC-THREADED
     165kWorkerTls64K_DEFS      = KWORKER_BASE=0x10000 TLS_SIZE=65536
     166kWorkerTls64K_SOURCES   = kWorkerTlsXxxK.c
     167kWorkerTls64K_LDFLAGS   = /Entry:DummyDllEntry
     168
     169kWorkerTls512K_TEMPLATE = BIN-STATIC-THREADED
     170kWorkerTls512K_DEFS     = KWORKER_BASE=0x10000 TLS_SIZE=524288
     171kWorkerTls512K_SOURCES  = kWorkerTlsXxxK.c
     172kWorkerTls512K_LDFLAGS  = /Entry:DummyDllEntry
     173
    155174
    156175include $(KBUILD_PATH)/subfooter.kmk
  • trunk/src/kWorker/kWorker.c

    r2987 r3042  
    293293                KSIZE           cbToZero;
    294294            } aQuickZeroChunks[3];
     295
     296            /** TLS index if one was allocated, otherwise KU32_MAX. */
     297            KU32                idxTls;
     298            /** Offset (RVA) of the TLS initialization data. */
     299            KU32                offTlsInitData;
     300            /** Number of bytes of TLS initialization data. */
     301            KU32                cbTlsInitData;
     302            /** Number of allocated bytes for TLS. */
     303            KU32                cbTlsAlloc;
     304            /** Number of TLS callbacks. */
     305            KU32                cTlsCallbacks;
     306            /** Offset (RVA) of the TLS callback table. */
     307            KU32                offTlsCallbacks;
     308
    295309            /** Number of imported modules. */
    296310            KSIZE               cImpMods;
     
    893907};
    894908
     909/** Module pending TLS allocation. See kwLdrModuleCreateNonNativeSetupTls. */
     910static PKWMODULE    g_pModPendingTlsAlloc = NULL;
     911
    895912
    896913/** The file system cache. */
     
    10231040static void kwSandboxConsoleWriteA(PKWSANDBOX pSandbox, PKWOUTPUTSTREAMBUF pLineBuf, const char *pchBuffer, KU32 cchToWrite);
    10241041#endif
     1042static PPEB kwSandboxGetProcessEnvironmentBlock(void);
    10251043
    10261044
     
    20022020
    20032021/**
     2022 * Called from TLS allocation DLL during DLL_PROCESS_ATTACH.
     2023 *
     2024 * @param   hDll            The DLL handle.
     2025 * @param   idxTls          The allocated TLS index.
     2026 * @param   ppfnTlsCallback Pointer to the TLS callback table entry.
     2027 */
     2028__declspec(dllexport) void kwLdrTlsAllocationHook(void *hDll, ULONG idxTls, PIMAGE_TLS_CALLBACK *ppfnTlsCallback)
     2029{
     2030    /*
     2031     * Do the module initialization thing first.
     2032     */
     2033    PKWMODULE pMod = g_pModPendingTlsAlloc;
     2034    if (pMod)
     2035    {
     2036        PPEB        pPeb = kwSandboxGetProcessEnvironmentBlock();
     2037        LIST_ENTRY *pHead;
     2038        LIST_ENTRY *pCur;
     2039
     2040        pMod->u.Manual.idxTls = idxTls;
     2041        KWLDR_LOG(("kwLdrTlsAllocationHook: idxTls=%d (%#x) for %s\n", idxTls, idxTls, pMod->pszPath));
     2042
     2043        /*
     2044         * Try sabotage the DLL name so we can load this module again.
     2045         */
     2046        pHead = &pPeb->Ldr->InMemoryOrderModuleList;
     2047        for (pCur = pHead->Blink; pCur != pHead; pCur = pCur->Blink)
     2048        {
     2049            LDR_DATA_TABLE_ENTRY *pMte;
     2050            pMte = (LDR_DATA_TABLE_ENTRY *)((KUPTR)pCur - K_OFFSETOF(LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks));
     2051            if (((KUPTR)pMte->DllBase & ~(KUPTR)31) == ((KUPTR)hDll & ~(KUPTR)31))
     2052            {
     2053                PUNICODE_STRING pStr = &pMte->FullDllName;
     2054                KSIZE off = pStr->Length / sizeof(pStr->Buffer[0]);
     2055                pStr->Buffer[--off]++;
     2056                pStr->Buffer[--off]++;
     2057                pStr->Buffer[--off]++;
     2058                KWLDR_LOG(("kwLdrTlsAllocationHook: patched the MTE (%p) for %p\n", pMte, hDll));
     2059                break;
     2060            }
     2061        }
     2062    }
     2063}
     2064
     2065
     2066/**
     2067 * Allocates and initializes TLS variables.
     2068 *
     2069 * @returns 0 on success, non-zero failure.
     2070 * @param   pMod                The module.
     2071 */
     2072static int kwLdrModuleCreateNonNativeSetupTls(PKWMODULE pMod)
     2073{
     2074    KU8                        *pbImg = (KU8 *)pMod->u.Manual.pbCopy;
     2075    IMAGE_NT_HEADERS const     *pNtHdrs;
     2076    IMAGE_DATA_DIRECTORY const *pTlsDir;
     2077
     2078    if (((PIMAGE_DOS_HEADER)pbImg)->e_magic == IMAGE_DOS_SIGNATURE)
     2079        pNtHdrs = (PIMAGE_NT_HEADERS)&pbImg[((PIMAGE_DOS_HEADER)pbImg)->e_lfanew];
     2080    else
     2081        pNtHdrs = (PIMAGE_NT_HEADERS)pbImg;
     2082    kHlpAssert(pNtHdrs->Signature == IMAGE_NT_SIGNATURE);
     2083
     2084    pTlsDir = &pNtHdrs->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS];
     2085    if (pTlsDir->Size >= sizeof(IMAGE_TLS_DIRECTORY))
     2086    {
     2087        PIMAGE_TLS_DIRECTORY const  paEntries = (PIMAGE_TLS_DIRECTORY)&pbImg[pTlsDir->VirtualAddress];
     2088        KU32 const                  cEntries  = pTlsDir->Size / sizeof(IMAGE_TLS_DIRECTORY);
     2089        KU32                        iEntry;
     2090        KUPTR                       offIndex;
     2091        KUPTR                       offCallbacks;
     2092        KUPTR const                *puCallbacks;
     2093        KSIZE                       cbData;
     2094        const wchar_t              *pwszTlsDll;
     2095        HMODULE                     hmodTlsDll;
     2096
     2097        /*
     2098         * Check and log.
     2099         */
     2100        for (iEntry = 0; iEntry < cEntries; iEntry++)
     2101        {
     2102            KUPTR        offIndex     = (KUPTR)paEntries[iEntry].AddressOfIndex     - (KUPTR)pMod->u.Manual.pbLoad;
     2103            KUPTR        offCallbacks = (KUPTR)paEntries[iEntry].AddressOfCallBacks - (KUPTR)pMod->u.Manual.pbLoad;
     2104            KUPTR const *puCallbacks  = (KUPTR const *)&pbImg[offCallbacks];
     2105            KWLDR_LOG(("TLS DIR #%u: %#x-%#x idx=@%#x (%#x) callbacks=@%#x (%#x) cbZero=%#x flags=%#x\n",
     2106                       iEntry, paEntries[iEntry].StartAddressOfRawData, paEntries[iEntry].EndAddressOfRawData,
     2107                       paEntries[iEntry].AddressOfIndex, offIndex, paEntries[iEntry].AddressOfCallBacks, offCallbacks,
     2108                       paEntries[iEntry].SizeOfZeroFill, paEntries[iEntry].Characteristics));
     2109
     2110            if (offIndex >= pMod->cbImage)
     2111            {
     2112                kwErrPrintf("TLS entry #%u in %s has an invalid index address: %p, RVA %p, image size %#x\n",
     2113                            iEntry, pMod->pszPath, paEntries[iEntry].AddressOfIndex, offIndex, pMod->cbImage);
     2114                return -1;
     2115            }
     2116            if (offCallbacks >= pMod->cbImage)
     2117            {
     2118                kwErrPrintf("TLS entry #%u in %s has an invalid callbacks address: %p, RVA %p, image size %#x\n",
     2119                            iEntry, pMod->pszPath, paEntries[iEntry].AddressOfCallBacks, offCallbacks, pMod->cbImage);
     2120                return -1;
     2121            }
     2122            while (*puCallbacks != 0)
     2123            {
     2124                KWLDR_LOG(("TLS DIR #%u:   callback %p, RVA %#x\n",
     2125                            iEntry, *puCallbacks, *puCallbacks - (KUPTR)pMod->u.Manual.pbLoad));
     2126                puCallbacks++;
     2127            }
     2128            if (paEntries[iEntry].Characteristics > IMAGE_SCN_ALIGN_16BYTES)
     2129            {
     2130                kwErrPrintf("TLS entry #%u in %s has an unsupported alignment restriction: %#x\n",
     2131                            iEntry, pMod->pszPath, paEntries[iEntry].Characteristics);
     2132                return -1;
     2133            }
     2134        }
     2135
     2136        if (cEntries > 1)
     2137        {
     2138            kwErrPrintf("More than one TLS directory entry in %s: %u\n", pMod->pszPath, cEntries);
     2139            return -1;
     2140        }
     2141
     2142        /*
     2143         * Make the allocation by loading a new instance of one of the TLS dlls.
     2144         * The DLL will make a call to
     2145         */
     2146        offIndex     = (KUPTR)paEntries[0].AddressOfIndex     - (KUPTR)pMod->u.Manual.pbLoad;
     2147        offCallbacks = (KUPTR)paEntries[0].AddressOfCallBacks - (KUPTR)pMod->u.Manual.pbLoad;
     2148        puCallbacks  = (KUPTR const *)&pbImg[offCallbacks];
     2149        cbData = paEntries[0].SizeOfZeroFill + (paEntries[0].EndAddressOfRawData - paEntries[0].StartAddressOfRawData);
     2150        if (cbData <= 1024)
     2151            pwszTlsDll = L"kWorkerTls1K.dll";
     2152        else if (cbData <= 65536)
     2153            pwszTlsDll = L"kWorkerTls64K.dll";
     2154        else if (cbData <= 524288)
     2155            pwszTlsDll = L"kWorkerTls512K.dll";
     2156        else
     2157        {
     2158            kwErrPrintf("TLS data size in %s is too big: %u (%#p), max 512KB\n", pMod->pszPath, (unsigned)cbData, cbData);
     2159            return -1;
     2160        }
     2161
     2162        pMod->u.Manual.idxTls         = KU32_MAX;
     2163        pMod->u.Manual.offTlsInitData = (KU32)((KUPTR)paEntries[0].StartAddressOfRawData - (KUPTR)pMod->u.Manual.pbLoad);
     2164        pMod->u.Manual.cbTlsInitData  = (KU32)(paEntries[0].EndAddressOfRawData - paEntries[0].StartAddressOfRawData);
     2165        pMod->u.Manual.cbTlsAlloc     = (KU32)cbData;
     2166        pMod->u.Manual.cTlsCallbacks  = 0;
     2167        while (puCallbacks[pMod->u.Manual.cTlsCallbacks] != 0)
     2168            pMod->u.Manual.cTlsCallbacks++;
     2169        pMod->u.Manual.offTlsCallbacks = pMod->u.Manual.cTlsCallbacks ? (KU32)offCallbacks : KU32_MAX;
     2170
     2171        g_pModPendingTlsAlloc = pMod;
     2172        hmodTlsDll = LoadLibraryExW(pwszTlsDll, NULL /*hFile*/, 0);
     2173        g_pModPendingTlsAlloc = NULL;
     2174        if (hmodTlsDll == NULL)
     2175        {
     2176            kwErrPrintf("TLS allocation failed for '%s': LoadLibraryExW(%ls) -> %u\n", pMod->pszPath, pwszTlsDll, GetLastError());
     2177            return -1;
     2178        }
     2179        if (pMod->u.Manual.idxTls == KU32_MAX)
     2180        {
     2181            kwErrPrintf("TLS allocation failed for '%s': idxTls = KU32_MAX\n", pMod->pszPath, GetLastError());
     2182            return -1;
     2183        }
     2184
     2185        *(KU32 *)&pMod->u.Manual.pbCopy[offIndex] = pMod->u.Manual.idxTls;
     2186        KWLDR_LOG(("kwLdrModuleCreateNonNativeSetupTls: idxTls=%d hmodTlsDll=%p (%ls) cbData=%#x\n",
     2187                   pMod->u.Manual.idxTls, hmodTlsDll, pwszTlsDll, cbData));
     2188    }
     2189    return 0;
     2190}
     2191
     2192
     2193/**
    20042194 * Creates a module using the our own loader.
    20052195 *
     
    20692259                    pMod->u.Manual.fRegisteredFunctionTable = K_FALSE;
    20702260#endif
    2071                     pMod->u.Manual.fUseLdBuf = K_FALSE;
    2072                     pMod->u.Manual.fCanDoQuick = K_FALSE;
     2261                    pMod->u.Manual.fUseLdBuf        = K_FALSE;
     2262                    pMod->u.Manual.fCanDoQuick      = K_FALSE;
    20732263                    pMod->u.Manual.cQuickZeroChunks = 0;
    20742264                    pMod->u.Manual.cQuickCopyChunks = 0;
     2265                    pMod->u.Manual.idxTls           = KU32_MAX;
     2266                    pMod->u.Manual.offTlsInitData   = KU32_MAX;
     2267                    pMod->u.Manual.cbTlsInitData    = 0;
     2268                    pMod->u.Manual.cbTlsAlloc       = 0;
     2269                    pMod->u.Manual.cTlsCallbacks    = 0;
     2270                    pMod->u.Manual.offTlsCallbacks  = 0;
    20752271                    pMod->pszPath       = (char *)kHlpMemCopy(&pMod->u.Manual.apImpMods[cImports + 1], pszPath, cbPath);
    20762272                    pMod->pwszPath      = (wchar_t *)(pMod->pszPath + cbPath + (cbPath & 1));
     
    21062302                            KW_LOG(("New module: %p LB %#010x %s (kLdr)\n",
    21072303                                    pMod->u.Manual.pbLoad, pMod->cbImage, pMod->pszPath));
     2304                            KW_LOG(("TODO: .reload /f %s=%p\n", pMod->pszPath, pMod->u.Manual.pbLoad));
    21082305                            kwDebuggerPrintf("TODO: .reload /f %s=%p\n", pMod->pszPath, pMod->u.Manual.pbLoad);
    21092306
     
    21572354                                    kwLdrModuleCreateNonNativeSetupQuickZeroAndCopy(pMod);
    21582355
    2159                                     /*
    2160                                      * Final finish.
    2161                                      */
    2162                                     pMod->u.Manual.pvBits = pMod->u.Manual.pbCopy;
    2163                                     pMod->u.Manual.enmState = KWMODSTATE_NEEDS_BITS;
    2164                                     g_cModules++;
    2165                                     g_cNonNativeModules++;
    2166                                     return pMod;
     2356                                    rc = kwLdrModuleCreateNonNativeSetupTls(pMod);
     2357                                    if (rc == 0)
     2358                                    {
     2359                                        /*
     2360                                         * Final finish.
     2361                                         */
     2362                                        pMod->u.Manual.pvBits = pMod->u.Manual.pbCopy;
     2363                                        pMod->u.Manual.enmState = KWMODSTATE_NEEDS_BITS;
     2364                                        g_cModules++;
     2365                                        g_cNonNativeModules++;
     2366                                        return pMod;
     2367                                    }
    21672368                                }
     2369                                else
     2370                                    kwErrPrintf("kLdrModGetBits failed for %s: %#x (%d)\n", pszPath, rc, rc);
    21682371                            }
    21692372
     
    22322435
    22332436    //printf("iImport=%u (%s) %*.*s rc=%d\n", iImport, &pImpMod->pszPath[pImpMod->offFilename], cchSymbol, cchSymbol, pchSymbol, rc);
     2437    KW_LOG(("iImport=%u (%s) %*.*s rc=%d\n", iImport, &pImpMod->pszPath[pImpMod->offFilename], cchSymbol, cchSymbol, pchSymbol, rc));
    22342438    return rc;
    22352439
     
    25232727
    25242728/**
     2729 * Does the TLS memory initialization for a module on the current thread.
     2730 *
     2731 * @returns 0 on success, error on failure.
     2732 * @param   pMod                The module.
     2733 */
     2734static int kwLdrCallTlsAllocateAndInit(PKWMODULE pMod)
     2735{
     2736    if (pMod->u.Manual.idxTls != KU32_MAX)
     2737    {
     2738        PTEB pTeb = NtCurrentTeb();
     2739        void **ppvTls = *(void ***)( (KUPTR)pTeb + (sizeof(void *) == 4 ? 0x2c : 0x58) );
     2740        KU8   *pbData = (KU8 *)ppvTls[pMod->u.Manual.idxTls];
     2741        KWLDR_LOG(("%s: TLS: Initializing %#x (%#x), idxTls=%d\n",
     2742                   pMod->pszPath, pbData, pMod->u.Manual.cbTlsAlloc, pMod->u.Manual.cbTlsInitData, pMod->u.Manual.idxTls));
     2743        if (pMod->u.Manual.cbTlsInitData < pMod->u.Manual.cbTlsAlloc)
     2744            kHlpMemSet(&pbData[pMod->u.Manual.cbTlsInitData], 0, pMod->u.Manual.cbTlsAlloc);
     2745        if (pMod->u.Manual.cbTlsInitData)
     2746            kHlpMemCopy(pbData, &pMod->u.Manual.pbCopy[pMod->u.Manual.offTlsInitData], pMod->u.Manual.cbTlsInitData);
     2747    }
     2748    return 0;
     2749}
     2750
     2751
     2752/**
     2753 * Does the TLS callbacks for a module.
     2754 *
     2755 * @param   pMod                The module.
     2756 * @param   dwReason            The callback reason.
     2757 */
     2758static void kwLdrCallTlsCallbacks(PKWMODULE pMod, DWORD dwReason)
     2759{
     2760    if (pMod->u.Manual.cTlsCallbacks)
     2761    {
     2762        PIMAGE_TLS_CALLBACK *pCallback = (PIMAGE_TLS_CALLBACK *)&pMod->u.Manual.pbLoad[pMod->u.Manual.offTlsCallbacks];
     2763        do
     2764        {
     2765            KWLDR_LOG(("%s: Calling TLS callback %p(%p,%#x,0)\n", pMod->pszPath, *pCallback, pMod->hOurMod, dwReason));
     2766            (*pCallback)(pMod->hOurMod, dwReason, 0);
     2767        } while (*++pCallback);
     2768    }
     2769}
     2770
     2771
     2772/**
    25252773 * Does module initialization starting at @a pMod.
    25262774 *
     
    25362784    if (!pMod->fNative)
    25372785    {
     2786        KWLDR_LOG(("kwLdrModuleInitTree: enmState=%#x idxTls=%u %s\n",
     2787                   pMod->u.Manual.enmState, pMod->u.Manual.idxTls, pMod->pszPath));
     2788
    25382789        /*
    25392790         * Need to copy bits?
     
    26072858#endif
    26082859
     2860
    26092861        if (pMod->u.Manual.enmState == KWMODSTATE_NEEDS_INIT)
    26102862        {
     
    26232875            }
    26242876
     2877            /* Do TLS allocations for module init? */
     2878            rc = kwLdrCallTlsAllocateAndInit(pMod);
     2879            if (rc != 0)
     2880                return rc;
     2881            if (pMod->u.Manual.cTlsCallbacks > 0)
     2882                kwLdrCallTlsCallbacks(pMod, DLL_PROCESS_ATTACH);
     2883
     2884            /* Finally call the entry point. */
    26252885            rc = kLdrModCallInit(pMod->pLdrMod, pMod->u.Manual.pbLoad, (KUPTR)pMod->hOurMod);
    26262886            if (rc == 0)
     
    28923152    /*
    28933153     * We associate the tools instances with the file system objects.
     3154     *
     3155     * We'd like to do the lookup without invaliding the volatile parts of the
     3156     * cache, thus the double lookup here.  The cache gets invalidate later on.
    28943157     */
    28953158    KFSLOOKUPERROR  enmError;
    28963159    PKFSOBJ         pToolFsObj = kFsCacheLookupA(g_pFsCache, pszExe, &enmError);
     3160    if (   !pToolFsObj
     3161        || pToolFsObj->bObjType != KFSOBJ_TYPE_FILE)
     3162    {
     3163        kFsCacheInvalidateCustomBoth(g_pFsCache);
     3164        pToolFsObj = kFsCacheLookupA(g_pFsCache, pszExe, &enmError);
     3165    }
    28973166    if (pToolFsObj)
    28983167    {
     
    29133182        kFsCacheObjRelease(g_pFsCache, pToolFsObj);
    29143183    }
     3184    else
     3185        pToolFsObj = kFsCacheLookupA(g_pFsCache, pszExe, &enmError);
    29153186    return NULL;
    29163187}
     
    34743745
    34753746
     3747/** _beginthreadex - create a new thread, msvcr120.dll hack for c2.dll. */
     3748static uintptr_t __cdecl kwSandbox_msvcr120__beginthreadex(void *pvSecAttr, unsigned cbStack,
     3749                                                           unsigned (__stdcall *pfnThreadProc)(void *), void *pvUser,
     3750                                                           unsigned fCreate, unsigned *pidThread)
     3751{
     3752    /*
     3753     * The VC++ 12 (VS 2013) compiler pass two is now threaded.  Let it do
     3754     * whatever it needs to.
     3755     */
     3756    KW_LOG(("kwSandbox_msvcr120__beginthreadex: pvSecAttr=%p (inh=%d) cbStack=%#x pfnThreadProc=%p pvUser=%p fCreate=%#x pidThread=%p\n",
     3757            pvSecAttr, pvSecAttr ? ((LPSECURITY_ATTRIBUTES)pvSecAttr)->bInheritHandle : 0, cbStack,
     3758            pfnThreadProc, pvUser, fCreate, pidThread));
     3759    if (g_Sandbox.pTool->u.Sandboxed.enmHint == KWTOOLHINT_VISUAL_CPP_CL)
     3760    {
     3761        uintptr_t rcRet;
     3762        static uintptr_t (__cdecl *s_pfnReal)(void *, unsigned , unsigned (__stdcall *)(void *), void *, unsigned , unsigned *);
     3763        if (!s_pfnReal)
     3764        {
     3765            *(FARPROC *)&s_pfnReal = GetProcAddress(GetModuleHandleA("msvcr120.dll"), "_beginthreadex");
     3766            if (!s_pfnReal)
     3767            {
     3768                kwErrPrintf("kwSandbox_msvcr120__beginthreadex: Failed to resolve _beginthreadex in msvcr120.dll!\n");
     3769                __debugbreak();
     3770            }
     3771        }
     3772        rcRet = s_pfnReal(pvSecAttr, cbStack, pfnThreadProc, pvUser, fCreate, pidThread);
     3773        KW_LOG(("kwSandbox_msvcr120__beginthreadex: returns %p *pidThread=%#x\n", rcRet, pidThread ? *pidThread : -1));
     3774        return rcRet;
     3775    }
     3776
     3777    kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread);
     3778    KWFS_TODO();
     3779    return 0;
     3780}
     3781
     3782
    34763783/** _beginthreadex - create a new thread. */
    34773784static uintptr_t __cdecl kwSandbox_msvcrt__beginthreadex(void *pvSecAttr, unsigned cbStack,
     
    43404647     * Deal with a couple of extremely unlikely special cases right away.
    43414648     */
    4342     if (   !(fFlags & LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE)
     4649    if (   (   !(fFlags & LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE)
     4650            || (fFlags & LOAD_LIBRARY_AS_IMAGE_RESOURCE))
    43434651        && (hFile == NULL || hFile == INVALID_HANDLE_VALUE) )
    43444652    { /* likely */ }
     
    43904698    if (fFlags & (  DONT_RESOLVE_DLL_REFERENCES
    43914699                  | LOAD_LIBRARY_AS_DATAFILE
     4700                  | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
    43924701                  | LOAD_LIBRARY_AS_IMAGE_RESOURCE) )
    43934702        return kwSandbox_Kernel32_LoadLibraryExA_Resource(pDynLoad, fFlags);
     
    44124721            pMod = NULL;
    44134722    }
    4414     if (pMod)
     4723    if (pMod && pMod != (PKWMODULE)~(KUPTR)0)
    44154724    {
    44164725        /* Enter it into the tool module table and dynamic link request cache. */
     
    44404749        KWFS_TODO();
    44414750        kHlpFree(pDynLoad);
    4442         SetLastError(ERROR_MOD_NOT_FOUND);
     4751        SetLastError(pMod ? ERROR_BAD_EXE_FORMAT : ERROR_MOD_NOT_FOUND);
    44434752    }
    44444753    return NULL;
     4754}
     4755
     4756
     4757/** Kernel32 - LoadLibraryExA() for native overloads */
     4758static HMODULE WINAPI kwSandbox_Kernel32_Native_LoadLibraryExA(LPCSTR pszFilename, HANDLE hFile, DWORD fFlags)
     4759{
     4760    char szTmp[512];
     4761    KWLDR_LOG(("kwSandbox_Kernel32_Native_LoadLibraryExA(%s, %p, %#x)\n", pszFilename, hFile, fFlags));
     4762
     4763    /*
     4764     * We may have to help resolved unqualified DLLs living in the executable directory.
     4765     */
     4766    if (kHlpIsFilenameOnly(pszFilename))
     4767    {
     4768        KSIZE cchFilename = kHlpStrLen(pszFilename);
     4769        KSIZE cchExePath  = g_Sandbox.pTool->u.Sandboxed.pExe->offFilename;
     4770        if (cchExePath + cchFilename + 1 <= sizeof(szTmp))
     4771        {
     4772            kHlpMemCopy(szTmp, g_Sandbox.pTool->u.Sandboxed.pExe->pszPath, cchExePath);
     4773            kHlpMemCopy(&szTmp[cchExePath], pszFilename, cchFilename + 1);
     4774            if (kwFsPathExists(szTmp))
     4775            {
     4776                KWLDR_LOG(("kwSandbox_Kernel32_Native_LoadLibraryExA: %s -> %s\n", pszFilename, szTmp));
     4777                pszFilename = szTmp;
     4778            }
     4779        }
     4780    }
     4781
     4782    return LoadLibraryExA(pszFilename, hFile, fFlags);
    44454783}
    44464784
     
    44934831    KSIZE i;
    44944832    KSIZE cchModule;
     4833    PKWDYNLOAD pDynLoad;
    44954834    kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread);
    44964835
     
    45144853        }
    45154854
     4855    /*
     4856     * Modules we've dynamically loaded.
     4857     */
     4858    for (pDynLoad = g_Sandbox.pTool->u.Sandboxed.pDynLoadHead; pDynLoad; pDynLoad = pDynLoad->pNext)
     4859        if (   pDynLoad->pMod
     4860            && (   stricmp(pDynLoad->pMod->pszPath, pszModule) == 0
     4861                || stricmp(&pDynLoad->pMod->pszPath[pDynLoad->pMod->offFilename], pszModule) == 0) )
     4862        {
     4863            if (   pDynLoad->pMod->fNative
     4864                || pDynLoad->pMod->u.Manual.enmState == KWMODSTATE_READY)
     4865            {
     4866                KW_LOG(("kwSandbox_Kernel32_GetModuleHandleA(%s,,) -> %p [dynload]\n", pszModule, pDynLoad->hmod));
     4867                return pDynLoad->hmod;
     4868            }
     4869            SetLastError(ERROR_MOD_NOT_FOUND);
     4870            return NULL;
     4871        }
     4872
     4873    kwErrPrintf("pszModule=%s\n", pszModule);
    45164874    KWFS_TODO();
     4875    SetLastError(ERROR_MOD_NOT_FOUND);
    45174876    return NULL;
    45184877}
     
    45244883    KSIZE i;
    45254884    KSIZE cwcModule;
     4885    PKWDYNLOAD pDynLoad;
    45264886    kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread);
    45274887
     
    45454905        }
    45464906
     4907    /*
     4908     * Modules we've dynamically loaded.
     4909     */
     4910    for (pDynLoad = g_Sandbox.pTool->u.Sandboxed.pDynLoadHead; pDynLoad; pDynLoad = pDynLoad->pNext)
     4911        if (   pDynLoad->pMod
     4912            && (   _wcsicmp(pDynLoad->pMod->pwszPath, pwszModule) == 0
     4913                || _wcsicmp(&pDynLoad->pMod->pwszPath[pDynLoad->pMod->offFilename], pwszModule) == 0) ) /** @todo wrong offset */
     4914        {
     4915            if (   pDynLoad->pMod->fNative
     4916                || pDynLoad->pMod->u.Manual.enmState == KWMODSTATE_READY)
     4917            {
     4918                KW_LOG(("kwSandbox_Kernel32_GetModuleHandleW(%ls,,) -> %p [dynload]\n", pwszModule, pDynLoad->hmod));
     4919                return pDynLoad->hmod;
     4920            }
     4921            SetLastError(ERROR_MOD_NOT_FOUND);
     4922            return NULL;
     4923        }
     4924
     4925    kwErrPrintf("pwszModule=%ls\n", pwszModule);
    45474926    KWFS_TODO();
     4927    SetLastError(ERROR_MOD_NOT_FOUND);
    45484928    return NULL;
    45494929}
     
    87609140}
    87619141
     9142
     9143/** CRT - memset   */
     9144static void * __cdecl kwSandbox_msvcrt_memset(void *pvDst, int bFiller, size_t cb)
     9145{
     9146    KU8       *pbDst = (KU8 *)pvDst;
     9147    KSIZE      cbLeft = cb;
     9148    while (cbLeft-- > 0)
     9149        *pbDst++ = bFiller;
     9150    return pvDst;
     9151}
     9152
    87629153#endif /* NDEBUG */
    87639154
     
    88829273    { TUPLE("_beginthread"),                NULL,       (KUPTR)kwSandbox_msvcrt__beginthread },
    88839274    { TUPLE("_beginthreadex"),              NULL,       (KUPTR)kwSandbox_msvcrt__beginthreadex },
     9275    { TUPLE("_beginthreadex"),          "msvcr120.dll", (KUPTR)kwSandbox_msvcr120__beginthreadex }, /* higher priority last */
    88849276
    88859277    { TUPLE("__argc"),                      NULL,       (KUPTR)&g_Sandbox.cArgs },
     
    89219313#ifndef NDEBUG
    89229314    { TUPLE("memcpy"),                      NULL,       (KUPTR)kwSandbox_msvcrt_memcpy },
     9315    { TUPLE("memset"),                      NULL,       (KUPTR)kwSandbox_msvcrt_memset },
    89239316#endif
    89249317};
     
    89709363#endif
    89719364    { TUPLE("SetConsoleCtrlHandler"),       NULL,       (KUPTR)kwSandbox_Kernel32_SetConsoleCtrlHandler },
     9365    { TUPLE("LoadLibraryExA"),              NULL,       (KUPTR)kwSandbox_Kernel32_Native_LoadLibraryExA },
    89729366
    89739367    { TUPLE("WriteConsoleA"),               NULL,       (KUPTR)kwSandbox_Kernel32_WriteConsoleA },
     
    988810282    }
    988910283    else
     10284    {
     10285        kwErrPrintf("kwToolLookup(%s) -> NULL\n", pszExecutable);
    989010286        rcExit = 42 + 1;
     10287    }
    989110288    return rcExit;
    989210289}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette