Author: hbelusca
Date: Mon Dec 22 19:44:59 2014
New Revision: 65797
URL:
http://svn.reactos.org/svn/reactos?rev=65797&view=rev
Log:
[GDI32]
- Call NtGdiInit before initializing ourselves (ok, in ROS NtGdiInit does nothing
interesting, but still do it to be call-compatible with win2k3 so everything initializes
as it should).
- Do some cleanup on process detach.
Modified:
trunk/reactos/win32ss/gdi/gdi32/main/dllmain.c
Modified: trunk/reactos/win32ss/gdi/gdi32/main/dllmain.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/gdi32/main/dll…
==============================================================================
--- trunk/reactos/win32ss/gdi/gdi32/main/dllmain.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/gdi32/main/dllmain.c [iso-8859-1] Mon Dec 22 19:44:59 2014
@@ -18,7 +18,7 @@
*/
BOOL
WINAPI
-DllMain (
+DllMain(
HANDLE hDll,
DWORD dwReason,
LPVOID lpReserved)
@@ -38,7 +38,7 @@
VOID
WINAPI
-GdiProcessSetup (VOID)
+GdiProcessSetup(VOID)
{
hProcessHeap = GetProcessHeap();
@@ -53,36 +53,62 @@
InitializeCriticalSection(&gcsClientObjLinks);
}
+VOID
+WINAPI
+GdiProcessShutdown(VOID)
+{
+ DeleteCriticalSection(&gcsClientObjLinks);
+ RtlDeleteCriticalSection(&semLocal);
+}
+
/*
* @implemented
*/
BOOL
WINAPI
-GdiDllInitialize (
+GdiDllInitialize(
HANDLE hDll,
DWORD dwReason,
LPVOID lpReserved)
{
switch (dwReason)
{
- case DLL_PROCESS_ATTACH:
- GdiProcessSetup ();
- break;
+ case DLL_PROCESS_ATTACH:
+ {
+ /* Don't bother us for each thread */
+ // DisableThreadLibraryCalls(hDll);
- case DLL_THREAD_ATTACH:
- NtCurrentTeb()->GdiTebBatch.Offset = 0;
- NtCurrentTeb()->GdiBatchCount = 0;
- break;
+ /* Initialize the kernel part of GDI first */
+ if (!NtGdiInit()) return FALSE;
- default:
- return FALSE;
+ /* Now initialize ourselves */
+ GdiProcessSetup();
+ break;
+ }
+
+ case DLL_THREAD_ATTACH:
+ {
+ NtCurrentTeb()->GdiTebBatch.Offset = 0;
+ NtCurrentTeb()->GdiBatchCount = 0;
+ break;
+ }
+
+ case DLL_PROCESS_DETACH:
+ {
+ /* Cleanup */
+ GdiProcessShutdown();
+ return TRUE;
+ }
+
+ default:
+ return FALSE;
}
- // Very simple, the list will fill itself as it is needed.
- if(!SetStockObjects)
+ /* Very simple, the list will fill itself as it is needed */
+ if (!SetStockObjects)
{
- RtlZeroMemory( &stock_objects, NB_STOCK_OBJECTS); //Assume Ros is dirty.
+ RtlZeroMemory(&stock_objects, NB_STOCK_OBJECTS); // Assume ROS is dirty
SetStockObjects = TRUE;
}