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/dllm... ============================================================================== --- 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; }