X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=lib%2Fuser32%2Fmisc%2Fdllmain.c;h=611cb1eec78be2074f52b85a11e428e8e41f67a8;hp=eddbc972e1a98f6299d92ba8dffaa81924116ca0;hb=HEAD;hpb=7c0db166f81fbe8c8b913d7f26048e337d383605 diff --git a/lib/user32/misc/dllmain.c b/lib/user32/misc/dllmain.c index eddbc97..611cb1e 100644 --- a/lib/user32/misc/dllmain.c +++ b/lib/user32/misc/dllmain.c @@ -1,7 +1,11 @@ #include #include #include +#include #include +#include +#include +#include #ifdef DBG @@ -10,11 +14,39 @@ DWORD DebugTraceLevel = MIN_TRACE; #endif /* DBG */ +static ULONG User32TlsIndex; + /* To make the linker happy */ VOID STDCALL KeBugCheck (ULONG BugCheckCode) {} HWINSTA ProcessWindowStation; +PUSER32_THREAD_DATA +User32GetThreadData() +{ + return((PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex)); +} + +VOID +InitThread(VOID) +{ + PUSER32_THREAD_DATA ThreadData; + + ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(USER32_THREAD_DATA)); + TlsSetValue(User32TlsIndex, ThreadData); +} + +VOID +CleanupThread(VOID) +{ + PUSER32_THREAD_DATA ThreadData; + + ThreadData = (PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex); + HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, ThreadData); + TlsSetValue(User32TlsIndex, 0); +} + DWORD Init(VOID) { @@ -33,8 +65,26 @@ Init(VOID) (PVOID)User32SendGETMINMAXINFOMessageForKernel; NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDNCCALCSIZE] = (PVOID)User32SendNCCALCSIZEMessageForKernel; + NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDWINDOWPOSCHANGING] = + (PVOID)User32SendWINDOWPOSCHANGINGMessageForKernel; + NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDWINDOWPOSCHANGED] = + (PVOID)User32SendWINDOWPOSCHANGEDMessageForKernel; + NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDSTYLECHANGING] = + (PVOID)User32SendSTYLECHANGINGMessageForKernel; + NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDSTYLECHANGED] = + (PVOID)User32SendSTYLECHANGEDMessageForKernel; + NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] = + (PVOID)User32LoadSysMenuTemplateForKernel; + NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] = + (PVOID)User32SetupDefaultCursors; + + /* Allocate an index for user32 thread local data. */ + User32TlsIndex = TlsAlloc(); UserSetupInternalPos(); + MenuInit(); + + RtlInitializeCriticalSection(&U32AccelCacheLock); GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL); @@ -48,29 +98,40 @@ Cleanup(VOID) GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL); + TlsFree(User32TlsIndex); + return(Status); } + + INT STDCALL -DllMain(PVOID hinstDll, - ULONG dwReason, - PVOID reserved) +DllMain( + PVOID hinstDll, + ULONG dwReason, + PVOID reserved + ) { D(MAX_TRACE, ("hinstDll (0x%X) dwReason (0x%X)\n", hinstDll, dwReason)); switch (dwReason) { case DLL_PROCESS_ATTACH: + hProcessHeap = RtlGetProcessHeap(); Init(); + InitThread(); break; case DLL_THREAD_ATTACH: + InitThread(); break; case DLL_THREAD_DETACH: + CleanupThread(); break; case DLL_PROCESS_DETACH: + DeleteFrameBrushes(); + CleanupThread(); Cleanup(); break; } return(1); } -