5 /* FIXME: Belongs to some header. */
6 BOOL STDCALL
GdiDllInitialize(HANDLE
, DWORD
, LPVOID
);
7 void InitStockObjects(void);
8 VOID
DeleteFrameBrushes(VOID
);
10 extern CRITICAL_SECTION gcsMPH
;
11 static ULONG User32TlsIndex
;
12 HINSTANCE User32Instance
;
13 HWINSTA ProcessWindowStation
;
18 return((PUSER32_THREAD_DATA
)TlsGetValue(User32TlsIndex
));
24 PUSER32_THREAD_DATA ThreadData
;
26 ThreadData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
27 sizeof(USER32_THREAD_DATA
));
28 TlsSetValue(User32TlsIndex
, ThreadData
);
34 PUSER32_THREAD_DATA ThreadData
;
36 ThreadData
= (PUSER32_THREAD_DATA
)TlsGetValue(User32TlsIndex
);
37 HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY
, ThreadData
);
38 TlsSetValue(User32TlsIndex
, 0);
44 /* Set up the kernel callbacks. */
45 NtCurrentTeb()->ProcessEnvironmentBlock
->KernelCallbackTable
[USER32_CALLBACK_WINDOWPROC
] =
46 (PVOID
)User32CallWindowProcFromKernel
;
47 NtCurrentTeb()->ProcessEnvironmentBlock
->KernelCallbackTable
[USER32_CALLBACK_SENDASYNCPROC
] =
48 (PVOID
)User32CallSendAsyncProcForKernel
;
49 NtCurrentTeb()->ProcessEnvironmentBlock
->KernelCallbackTable
[USER32_CALLBACK_LOADSYSMENUTEMPLATE
] =
50 (PVOID
)User32LoadSysMenuTemplateForKernel
;
51 NtCurrentTeb()->ProcessEnvironmentBlock
->KernelCallbackTable
[USER32_CALLBACK_LOADDEFAULTCURSORS
] =
52 (PVOID
)User32SetupDefaultCursors
;
53 NtCurrentTeb()->ProcessEnvironmentBlock
->KernelCallbackTable
[USER32_CALLBACK_HOOKPROC
] =
54 (PVOID
)User32CallHookProcFromKernel
;
56 /* Allocate an index for user32 thread local data. */
57 User32TlsIndex
= TlsAlloc();
62 InitializeCriticalSection(&U32AccelCacheLock
);
63 InitializeCriticalSection(&gcsMPH
);
65 GdiDllInitialize(NULL
, DLL_PROCESS_ATTACH
, NULL
);
72 GdiDllInitialize(NULL
, DLL_PROCESS_DETACH
, NULL
);
74 TlsFree(User32TlsIndex
);
88 case DLL_PROCESS_ATTACH
:
89 User32Instance
= hinstDll
;
90 hProcessHeap
= RtlGetProcessHeap();
94 case DLL_THREAD_ATTACH
:
97 case DLL_THREAD_DETACH
:
100 case DLL_PROCESS_DETACH
:
101 DeleteFrameBrushes();