Changeset 3366 in kBuild for trunk/src/kWorker/kWorkerTlsXxxK.c
- Timestamp:
- Jun 9, 2020 11:53:39 PM (4 years ago)
- File:
-
- 1 edited
-
trunk/src/kWorker/kWorkerTlsXxxK.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kWorker/kWorkerTlsXxxK.c
r3361 r3366 34 34 * Structures and Typedefs * 35 35 *********************************************************************************************************************************/ 36 typedef void KWLDRTLSALLOCATIONHOOK(void *hDll, ULONG idxTls, PIMAGE_TLS_CALLBACK *ppfnTlsCallback); 36 typedef void KWLDRTLSCALLBACK(void *hDll, DWORD dwReason, void *pvContext, void *pvWorkerModule); 37 typedef KWLDRTLSCALLBACK *PKWLDRTLSCALLBACK; 38 typedef PKWLDRTLSCALLBACK KWLDRTLSALLOCATIONHOOK(void *hDll, ULONG idxTls, char *pabInitData, void **ppvWorkerModule); 37 39 38 40 … … 48 50 /** The TLS pointer array. The 2nd entry is NULL and serve to terminate the array. 49 51 * The first entry can be used by kWorker if it needs to. */ 50 __declspec(dllexport) PIMAGE_TLS_CALLBACK g_apfnTlsCallbacks[2]= { DummyTlsCallback, NULL };52 __declspec(dllexport) PIMAGE_TLS_CALLBACK g_apfnTlsCallbacks[2] = { DummyTlsCallback, NULL }; 51 53 52 54 /** 53 55 * The TLS index. 54 56 */ 55 __declspec(dllexport) ULONG g_idxTls = ~(ULONG)0; 57 __declspec(dllexport) ULONG g_idxTls = ~(ULONG)0; 58 59 /** 60 * Callback context. 61 */ 62 __declspec(dllexport) void *g_pvWorkerModule = NULL; 63 64 /** 65 * Regular callback method (returned by kwLdrTlsAllocationHook). 66 */ 67 __declspec(dllexport) PKWLDRTLSCALLBACK g_pfnWorkerCallback = NULL; 68 69 56 70 57 71 /** 58 72 * Initialization data. 73 * kWorker will copy the init data of the target DLL here. 59 74 */ 60 //static char const g_abDummy[TLS_SIZE] = {0x42}; 61 static char g_abDummy[TLS_SIZE] = {0}; 75 static char g_abInitData[TLS_SIZE] = {0}; 62 76 63 77 /** … … 68 82 __declspec(allocate(".rdata$T")) const IMAGE_TLS_DIRECTORY _tls_used = 69 83 { 70 (ULONG_PTR)&g_ab Dummy,71 (ULONG_PTR)&g_ab Dummy + sizeof(g_abDummy),84 (ULONG_PTR)&g_abInitData, 85 (ULONG_PTR)&g_abInitData + sizeof(g_abInitData), 72 86 (ULONG_PTR)&g_idxTls, 73 87 (ULONG_PTR)&g_apfnTlsCallbacks, … … 75 89 IMAGE_SCN_ALIGN_32BYTES 76 90 }; 91 92 93 /** 94 * Just a dummy callback function in case the allocation hook gambit fails below 95 * (see KWLDRTLSCALLBACK). 96 */ 97 static void DummyWorkerCallback(void *hDll, DWORD dwReason, void *pvContext, void *pvWorkerModule) 98 { 99 (void)hDll; (void)dwReason; (void)pvContext; (void)pvWorkerModule; 100 } 77 101 78 102 … … 86 110 __declspec(dllexport) void __stdcall DummyTlsCallback(void *hDll, DWORD dwReason, void *pvContext) 87 111 { 88 (void)hDll; (void)dwReason; (void)pvContext; 89 if (dwReason == DLL_PROCESS_ATTACH) 112 if (g_pfnWorkerCallback) 113 g_pfnWorkerCallback(hDll, dwReason, pvContext, g_pvWorkerModule); 114 else 90 115 { 91 //HMODULE hModExe = (HMODULE)(ULONG_PTR)KWORKER_BASE; 92 HMODULE hModExe = GetModuleHandleW(NULL); 93 KWLDRTLSALLOCATIONHOOK *pfnHook = (KWLDRTLSALLOCATIONHOOK *)GetProcAddress(hModExe, "kwLdrTlsAllocationHook"); 94 if (pfnHook) 116 g_pfnWorkerCallback = DummyWorkerCallback; 117 if (dwReason == DLL_PROCESS_ATTACH) 95 118 { 96 pfnHook(hDll, g_idxTls, &g_apfnTlsCallbacks[0]); 97 return; 119 HMODULE hModExe = GetModuleHandleW(NULL); 120 KWLDRTLSALLOCATIONHOOK *pfnHook = (KWLDRTLSALLOCATIONHOOK *)GetProcAddress(hModExe, "kwLdrTlsAllocationHook"); 121 if (pfnHook) 122 g_pfnWorkerCallback = pfnHook(hDll, g_idxTls, g_abInitData, &g_pvWorkerModule); 123 else 124 __debugbreak(); 98 125 } 99 __debugbreak();100 126 } 101 127 }
Note:
See TracChangeset
for help on using the changeset viewer.

