update for HEAD-2003091401
[reactos.git] / 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 static ULONG User32TlsIndex;
18
19 /* To make the linker happy */
20 VOID STDCALL KeBugCheck (ULONG  BugCheckCode) {}
21
22 HWINSTA ProcessWindowStation;
23
24 PUSER32_THREAD_DATA
25 User32GetThreadData()
26 {
27   return((PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex));
28 }
29
30 VOID
31 InitThread(VOID)
32 {
33   PUSER32_THREAD_DATA ThreadData;
34
35   ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
36                          sizeof(USER32_THREAD_DATA));
37   TlsSetValue(User32TlsIndex, ThreadData);
38 }
39
40 VOID
41 CleanupThread(VOID)
42 {
43   PUSER32_THREAD_DATA ThreadData;
44
45   ThreadData = (PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex);
46   HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, ThreadData);
47   TlsSetValue(User32TlsIndex, 0);
48 }
49
50 DWORD
51 Init(VOID)
52 {
53   DWORD Status;
54
55   /* Set up the kernel callbacks. */
56   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] =
57     (PVOID)User32CallWindowProcFromKernel;
58   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDASYNCPROC] =
59     (PVOID)User32CallSendAsyncProcForKernel;
60   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDNCCREATE] =
61     (PVOID)User32SendNCCREATEMessageForKernel;
62   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDCREATE] =
63     (PVOID)User32SendCREATEMessageForKernel;
64   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDGETMINMAXINFO] =
65     (PVOID)User32SendGETMINMAXINFOMessageForKernel;
66   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDNCCALCSIZE] =
67     (PVOID)User32SendNCCALCSIZEMessageForKernel;
68   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDWINDOWPOSCHANGING] =
69     (PVOID)User32SendWINDOWPOSCHANGINGMessageForKernel;
70   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDWINDOWPOSCHANGED] =
71     (PVOID)User32SendWINDOWPOSCHANGEDMessageForKernel;
72   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDSTYLECHANGING] =
73     (PVOID)User32SendSTYLECHANGINGMessageForKernel;
74   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDSTYLECHANGED] =
75     (PVOID)User32SendSTYLECHANGEDMessageForKernel;
76   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] =
77     (PVOID)User32LoadSysMenuTemplateForKernel;
78   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] =
79     (PVOID)User32SetupDefaultCursors;
80
81   /* Allocate an index for user32 thread local data. */
82   User32TlsIndex = TlsAlloc();
83
84   UserSetupInternalPos();
85   MenuInit();
86
87   RtlInitializeCriticalSection(&U32AccelCacheLock);
88
89   GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL);
90
91   return(Status);
92 }
93
94 DWORD
95 Cleanup(VOID)
96 {
97   DWORD Status;
98
99   GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL);
100
101   TlsFree(User32TlsIndex);
102
103   return(Status);
104 }
105
106
107
108 INT STDCALL
109 DllMain(
110         PVOID  hinstDll,
111         ULONG  dwReason,
112         PVOID  reserved
113         )
114 {
115   D(MAX_TRACE, ("hinstDll (0x%X)  dwReason (0x%X)\n", hinstDll, dwReason));
116
117   switch (dwReason)
118     {
119     case DLL_PROCESS_ATTACH:
120       hProcessHeap = RtlGetProcessHeap();
121       Init();
122       InitThread();
123       break;
124     case DLL_THREAD_ATTACH:
125       InitThread();
126       break;
127     case DLL_THREAD_DETACH:
128       CleanupThread();
129       break;
130     case DLL_PROCESS_DETACH:
131       DeleteFrameBrushes();
132       CleanupThread();
133       Cleanup();
134       break;
135     }
136   return(1);
137 }