VirtualBox

Changeset 3366 in kBuild for trunk/src/kWorker/kWorkerTlsXxxK.c


Ignore:
Timestamp:
Jun 9, 2020 11:53:39 PM (4 years ago)
Author:
bird
Message:

kWorker: More complete TLS handling. More TLS DLLs. Make handle table management thread safe. Lots more stack for new 201x compilers. ++

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kWorker/kWorkerTlsXxxK.c

    r3361 r3366  
    3434*   Structures and Typedefs                                                                                                      *
    3535*********************************************************************************************************************************/
    36 typedef void KWLDRTLSALLOCATIONHOOK(void *hDll, ULONG idxTls, PIMAGE_TLS_CALLBACK *ppfnTlsCallback);
     36typedef void KWLDRTLSCALLBACK(void *hDll, DWORD dwReason, void *pvContext, void *pvWorkerModule);
     37typedef KWLDRTLSCALLBACK *PKWLDRTLSCALLBACK;
     38typedef PKWLDRTLSCALLBACK KWLDRTLSALLOCATIONHOOK(void *hDll, ULONG idxTls, char *pabInitData, void **ppvWorkerModule);
    3739
    3840
     
    4850/** The TLS pointer array. The 2nd entry is NULL and serve to terminate the array.
    4951 * 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 };
    5153
    5254/**
    5355 * The TLS index.
    5456 */
    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
    5670
    5771/**
    5872 * Initialization data.
     73 * kWorker will copy the init data of the target DLL here.
    5974 */
    60 //static char const g_abDummy[TLS_SIZE] = {0x42};
    61 static char g_abDummy[TLS_SIZE] = {0};
     75static char g_abInitData[TLS_SIZE] = {0};
    6276
    6377/**
     
    6882__declspec(allocate(".rdata$T")) const IMAGE_TLS_DIRECTORY _tls_used =
    6983{
    70     (ULONG_PTR)&g_abDummy,
    71     (ULONG_PTR)&g_abDummy + sizeof(g_abDummy),
     84    (ULONG_PTR)&g_abInitData,
     85    (ULONG_PTR)&g_abInitData + sizeof(g_abInitData),
    7286    (ULONG_PTR)&g_idxTls,
    7387    (ULONG_PTR)&g_apfnTlsCallbacks,
     
    7589    IMAGE_SCN_ALIGN_32BYTES
    7690};
     91
     92
     93/**
     94 * Just a dummy callback function in case the allocation hook gambit fails below
     95 * (see KWLDRTLSCALLBACK).
     96 */
     97static void DummyWorkerCallback(void *hDll, DWORD dwReason, void *pvContext, void *pvWorkerModule)
     98{
     99    (void)hDll; (void)dwReason; (void)pvContext; (void)pvWorkerModule;
     100}
    77101
    78102
     
    86110__declspec(dllexport) void __stdcall DummyTlsCallback(void *hDll, DWORD dwReason, void *pvContext)
    87111{
    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
    90115    {
    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)
    95118        {
    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();
    98125        }
    99         __debugbreak();
    100126    }
    101127}
Note: See TracChangeset for help on using the changeset viewer.

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