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