Silence debug messages
[reactos.git] / reactos / lib / user32 / misc / dllmain.c
1 #include <windows.h>
2 #include <debug.h>
3 #include <user32/callback.h>
4 #include <user32/accel.h>
5 #include <window.h>
6 #include <menu.h>
7 #include <user32.h>
8 #include <strpool.h>
9
10 #ifdef DBG
11
12 /* See debug.h for debug/trace constants */
13 DWORD DebugTraceLevel = MIN_TRACE;
14
15 #endif /* DBG */
16
17 extern RTL_CRITICAL_SECTION gcsMPH;
18 static ULONG User32TlsIndex;
19
20 /* To make the linker happy */
21 VOID STDCALL KeBugCheck (ULONG BugCheckCode) {}
22
23 HWINSTA ProcessWindowStation;
24
25 PUSER32_THREAD_DATA
26 User32GetThreadData()
27 {
28 return((PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex));
29 }
30
31 VOID
32 InitThread(VOID)
33 {
34 PUSER32_THREAD_DATA ThreadData;
35
36 ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
37 sizeof(USER32_THREAD_DATA));
38 TlsSetValue(User32TlsIndex, ThreadData);
39 }
40
41 VOID
42 CleanupThread(VOID)
43 {
44 PUSER32_THREAD_DATA ThreadData;
45
46 ThreadData = (PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex);
47 HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, ThreadData);
48 TlsSetValue(User32TlsIndex, 0);
49 }
50
51 DWORD
52 Init(VOID)
53 {
54 DWORD Status;
55
56 /* Set up the kernel callbacks. */
57 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] =
58 (PVOID)User32CallWindowProcFromKernel;
59 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDASYNCPROC] =
60 (PVOID)User32CallSendAsyncProcForKernel;
61 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] =
62 (PVOID)User32LoadSysMenuTemplateForKernel;
63 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] =
64 (PVOID)User32SetupDefaultCursors;
65 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_HOOKPROC] =
66 (PVOID)User32CallHookProcFromKernel;
67
68 /* Allocate an index for user32 thread local data. */
69 User32TlsIndex = TlsAlloc();
70
71 MenuInit();
72
73 RtlInitializeCriticalSection(&U32AccelCacheLock);
74 RtlInitializeCriticalSection(&gcsMPH);
75
76 GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL);
77
78 return(Status);
79 }
80
81 DWORD
82 Cleanup(VOID)
83 {
84 DWORD Status;
85
86 GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL);
87
88 TlsFree(User32TlsIndex);
89
90 return(Status);
91 }
92
93
94
95 INT STDCALL
96 DllMain(
97 PVOID hinstDll,
98 ULONG dwReason,
99 PVOID reserved
100 )
101 {
102 switch (dwReason)
103 {
104 case DLL_PROCESS_ATTACH:
105 hProcessHeap = RtlGetProcessHeap();
106 Init();
107 /* InitThread();*/
108 break;
109 case DLL_THREAD_ATTACH:
110 InitThread();
111 break;
112 case DLL_THREAD_DETACH:
113 CleanupThread();
114 break;
115 case DLL_PROCESS_DETACH:
116 DeleteFrameBrushes();
117 /* CleanupThread();*/
118 Cleanup();
119 break;
120 }
121 return(1);
122 }