Changeset 3042 in kBuild
- Timestamp:
- May 11, 2017 10:23:12 AM (8 years ago)
- Location:
- trunk/src/kWorker
- Files:
-
- 1 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kWorker/Makefile.kmk
r2968 r3042 153 153 154 154 155 # 156 # A couple of dummy DLLs we use for grabbing LDR TLS entries. 157 # 158 DLLS += kWorkerTls1K kWorkerTls64K kWorkerTls512K 159 kWorkerTls1K_TEMPLATE = BIN-STATIC-THREADED 160 kWorkerTls1K_DEFS = KWORKER_BASE=0x10000 TLS_SIZE=1024 161 kWorkerTls1K_SOURCES = kWorkerTlsXxxK.c 162 kWorkerTls1K_LDFLAGS = /Entry:DummyDllEntry 163 164 kWorkerTls64K_TEMPLATE = BIN-STATIC-THREADED 165 kWorkerTls64K_DEFS = KWORKER_BASE=0x10000 TLS_SIZE=65536 166 kWorkerTls64K_SOURCES = kWorkerTlsXxxK.c 167 kWorkerTls64K_LDFLAGS = /Entry:DummyDllEntry 168 169 kWorkerTls512K_TEMPLATE = BIN-STATIC-THREADED 170 kWorkerTls512K_DEFS = KWORKER_BASE=0x10000 TLS_SIZE=524288 171 kWorkerTls512K_SOURCES = kWorkerTlsXxxK.c 172 kWorkerTls512K_LDFLAGS = /Entry:DummyDllEntry 173 155 174 156 175 include $(KBUILD_PATH)/subfooter.kmk -
trunk/src/kWorker/kWorker.c
r2987 r3042 293 293 KSIZE cbToZero; 294 294 } 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 295 309 /** Number of imported modules. */ 296 310 KSIZE cImpMods; … … 893 907 }; 894 908 909 /** Module pending TLS allocation. See kwLdrModuleCreateNonNativeSetupTls. */ 910 static PKWMODULE g_pModPendingTlsAlloc = NULL; 911 895 912 896 913 /** The file system cache. */ … … 1023 1040 static void kwSandboxConsoleWriteA(PKWSANDBOX pSandbox, PKWOUTPUTSTREAMBUF pLineBuf, const char *pchBuffer, KU32 cchToWrite); 1024 1041 #endif 1042 static PPEB kwSandboxGetProcessEnvironmentBlock(void); 1025 1043 1026 1044 … … 2002 2020 2003 2021 /** 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 */ 2072 static 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 /** 2004 2194 * Creates a module using the our own loader. 2005 2195 * … … 2069 2259 pMod->u.Manual.fRegisteredFunctionTable = K_FALSE; 2070 2260 #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; 2073 2263 pMod->u.Manual.cQuickZeroChunks = 0; 2074 2264 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; 2075 2271 pMod->pszPath = (char *)kHlpMemCopy(&pMod->u.Manual.apImpMods[cImports + 1], pszPath, cbPath); 2076 2272 pMod->pwszPath = (wchar_t *)(pMod->pszPath + cbPath + (cbPath & 1)); … … 2106 2302 KW_LOG(("New module: %p LB %#010x %s (kLdr)\n", 2107 2303 pMod->u.Manual.pbLoad, pMod->cbImage, pMod->pszPath)); 2304 KW_LOG(("TODO: .reload /f %s=%p\n", pMod->pszPath, pMod->u.Manual.pbLoad)); 2108 2305 kwDebuggerPrintf("TODO: .reload /f %s=%p\n", pMod->pszPath, pMod->u.Manual.pbLoad); 2109 2306 … … 2157 2354 kwLdrModuleCreateNonNativeSetupQuickZeroAndCopy(pMod); 2158 2355 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 } 2167 2368 } 2369 else 2370 kwErrPrintf("kLdrModGetBits failed for %s: %#x (%d)\n", pszPath, rc, rc); 2168 2371 } 2169 2372 … … 2232 2435 2233 2436 //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)); 2234 2438 return rc; 2235 2439 … … 2523 2727 2524 2728 /** 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 */ 2734 static 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 */ 2758 static 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 /** 2525 2773 * Does module initialization starting at @a pMod. 2526 2774 * … … 2536 2784 if (!pMod->fNative) 2537 2785 { 2786 KWLDR_LOG(("kwLdrModuleInitTree: enmState=%#x idxTls=%u %s\n", 2787 pMod->u.Manual.enmState, pMod->u.Manual.idxTls, pMod->pszPath)); 2788 2538 2789 /* 2539 2790 * Need to copy bits? … … 2607 2858 #endif 2608 2859 2860 2609 2861 if (pMod->u.Manual.enmState == KWMODSTATE_NEEDS_INIT) 2610 2862 { … … 2623 2875 } 2624 2876 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. */ 2625 2885 rc = kLdrModCallInit(pMod->pLdrMod, pMod->u.Manual.pbLoad, (KUPTR)pMod->hOurMod); 2626 2886 if (rc == 0) … … 2892 3152 /* 2893 3153 * 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. 2894 3157 */ 2895 3158 KFSLOOKUPERROR enmError; 2896 3159 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 } 2897 3166 if (pToolFsObj) 2898 3167 { … … 2913 3182 kFsCacheObjRelease(g_pFsCache, pToolFsObj); 2914 3183 } 3184 else 3185 pToolFsObj = kFsCacheLookupA(g_pFsCache, pszExe, &enmError); 2915 3186 return NULL; 2916 3187 } … … 3474 3745 3475 3746 3747 /** _beginthreadex - create a new thread, msvcr120.dll hack for c2.dll. */ 3748 static 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 3476 3783 /** _beginthreadex - create a new thread. */ 3477 3784 static uintptr_t __cdecl kwSandbox_msvcrt__beginthreadex(void *pvSecAttr, unsigned cbStack, … … 4340 4647 * Deal with a couple of extremely unlikely special cases right away. 4341 4648 */ 4342 if ( !(fFlags & LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE) 4649 if ( ( !(fFlags & LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE) 4650 || (fFlags & LOAD_LIBRARY_AS_IMAGE_RESOURCE)) 4343 4651 && (hFile == NULL || hFile == INVALID_HANDLE_VALUE) ) 4344 4652 { /* likely */ } … … 4390 4698 if (fFlags & ( DONT_RESOLVE_DLL_REFERENCES 4391 4699 | LOAD_LIBRARY_AS_DATAFILE 4700 | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 4392 4701 | LOAD_LIBRARY_AS_IMAGE_RESOURCE) ) 4393 4702 return kwSandbox_Kernel32_LoadLibraryExA_Resource(pDynLoad, fFlags); … … 4412 4721 pMod = NULL; 4413 4722 } 4414 if (pMod )4723 if (pMod && pMod != (PKWMODULE)~(KUPTR)0) 4415 4724 { 4416 4725 /* Enter it into the tool module table and dynamic link request cache. */ … … 4440 4749 KWFS_TODO(); 4441 4750 kHlpFree(pDynLoad); 4442 SetLastError( ERROR_MOD_NOT_FOUND);4751 SetLastError(pMod ? ERROR_BAD_EXE_FORMAT : ERROR_MOD_NOT_FOUND); 4443 4752 } 4444 4753 return NULL; 4754 } 4755 4756 4757 /** Kernel32 - LoadLibraryExA() for native overloads */ 4758 static 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); 4445 4783 } 4446 4784 … … 4493 4831 KSIZE i; 4494 4832 KSIZE cchModule; 4833 PKWDYNLOAD pDynLoad; 4495 4834 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 4496 4835 … … 4514 4853 } 4515 4854 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); 4516 4874 KWFS_TODO(); 4875 SetLastError(ERROR_MOD_NOT_FOUND); 4517 4876 return NULL; 4518 4877 } … … 4524 4883 KSIZE i; 4525 4884 KSIZE cwcModule; 4885 PKWDYNLOAD pDynLoad; 4526 4886 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 4527 4887 … … 4545 4905 } 4546 4906 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); 4547 4926 KWFS_TODO(); 4927 SetLastError(ERROR_MOD_NOT_FOUND); 4548 4928 return NULL; 4549 4929 } … … 8760 9140 } 8761 9141 9142 9143 /** CRT - memset */ 9144 static 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 8762 9153 #endif /* NDEBUG */ 8763 9154 … … 8882 9273 { TUPLE("_beginthread"), NULL, (KUPTR)kwSandbox_msvcrt__beginthread }, 8883 9274 { TUPLE("_beginthreadex"), NULL, (KUPTR)kwSandbox_msvcrt__beginthreadex }, 9275 { TUPLE("_beginthreadex"), "msvcr120.dll", (KUPTR)kwSandbox_msvcr120__beginthreadex }, /* higher priority last */ 8884 9276 8885 9277 { TUPLE("__argc"), NULL, (KUPTR)&g_Sandbox.cArgs }, … … 8921 9313 #ifndef NDEBUG 8922 9314 { TUPLE("memcpy"), NULL, (KUPTR)kwSandbox_msvcrt_memcpy }, 9315 { TUPLE("memset"), NULL, (KUPTR)kwSandbox_msvcrt_memset }, 8923 9316 #endif 8924 9317 }; … … 8970 9363 #endif 8971 9364 { TUPLE("SetConsoleCtrlHandler"), NULL, (KUPTR)kwSandbox_Kernel32_SetConsoleCtrlHandler }, 9365 { TUPLE("LoadLibraryExA"), NULL, (KUPTR)kwSandbox_Kernel32_Native_LoadLibraryExA }, 8972 9366 8973 9367 { TUPLE("WriteConsoleA"), NULL, (KUPTR)kwSandbox_Kernel32_WriteConsoleA }, … … 9888 10282 } 9889 10283 else 10284 { 10285 kwErrPrintf("kwToolLookup(%s) -> NULL\n", pszExecutable); 9890 10286 rcExit = 42 + 1; 10287 } 9891 10288 return rcExit; 9892 10289 }
Note:
See TracChangeset
for help on using the changeset viewer.