Partial patch of larger rosrtl removal patch. This one merely is a structure fix...
[reactos.git] / reactos / lib / user32 / misc / dllmain.c
1 #include <user32.h>
2
3 /* FIXME: Belongs to some header. */
4 WINBOOL STDCALL GdiDllInitialize(HANDLE, DWORD, LPVOID);
5 void InitStockObjects(void);
6 VOID DeleteFrameBrushes(VOID);
7
8 #ifdef DBG
9
10 /* See debug.h for debug/trace constants */
11 DWORD DebugTraceLevel = MIN_TRACE;
12
13 #endif /* DBG */
14
15 extern CRITICAL_SECTION gcsMPH;
16 static ULONG User32TlsIndex;
17 HINSTANCE User32Instance;
18 HWINSTA ProcessWindowStation;
19
20 PUSER32_THREAD_DATA
21 User32GetThreadData()
22 {
23 return((PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex));
24 }
25
26 VOID
27 InitThread(VOID)
28 {
29 PUSER32_THREAD_DATA ThreadData;
30
31 ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
32 sizeof(USER32_THREAD_DATA));
33 TlsSetValue(User32TlsIndex, ThreadData);
34 }
35
36 VOID
37 CleanupThread(VOID)
38 {
39 PUSER32_THREAD_DATA ThreadData;
40
41 ThreadData = (PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex);
42 HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, ThreadData);
43 TlsSetValue(User32TlsIndex, 0);
44 }
45
46 VOID
47 Init(VOID)
48 {
49 /* Set up the kernel callbacks. */
50 NtCurrentTeb()->ProcessEnvironmentBlock->KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] =
51 (PVOID)User32CallWindowProcFromKernel;
52 NtCurrentTeb()->ProcessEnvironmentBlock->KernelCallbackTable[USER32_CALLBACK_SENDASYNCPROC] =
53 (PVOID)User32CallSendAsyncProcForKernel;
54 NtCurrentTeb()->ProcessEnvironmentBlock->KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] =
55 (PVOID)User32LoadSysMenuTemplateForKernel;
56 NtCurrentTeb()->ProcessEnvironmentBlock->KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] =
57 (PVOID)User32SetupDefaultCursors;
58 NtCurrentTeb()->ProcessEnvironmentBlock->KernelCallbackTable[USER32_CALLBACK_HOOKPROC] =
59 (PVOID)User32CallHookProcFromKernel;
60
61 /* Allocate an index for user32 thread local data. */
62 User32TlsIndex = TlsAlloc();
63
64 MenuInit();
65 MessageInit();
66
67 InitializeCriticalSection(&U32AccelCacheLock);
68 InitializeCriticalSection(&gcsMPH);
69
70 GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL);
71 InitStockObjects();
72 }
73
74 VOID
75 Cleanup(VOID)
76 {
77 GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL);
78
79 TlsFree(User32TlsIndex);
80 }
81
82
83
84 INT STDCALL
85 DllMain(
86 PVOID hinstDll,
87 ULONG dwReason,
88 PVOID reserved
89 )
90 {
91 switch (dwReason)
92 {
93 case DLL_PROCESS_ATTACH:
94 User32Instance = hinstDll;
95 hProcessHeap = RtlGetProcessHeap();
96 Init();
97 InitThread();
98 break;
99 case DLL_THREAD_ATTACH:
100 InitThread();
101 break;
102 case DLL_THREAD_DETACH:
103 CleanupThread();
104 break;
105 case DLL_PROCESS_DETACH:
106 DeleteFrameBrushes();
107 CleanupThread();
108 Cleanup();
109 break;
110 }
111 return(1);
112 }