From 61886223b4a2be10d1b13894077b68e6a9477c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 22 Dec 2014 19:44:59 +0000 Subject: [PATCH] [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. svn path=/trunk/; revision=65797 --- reactos/win32ss/gdi/gdi32/main/dllmain.c | 56 +++++++++++++++++------- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/reactos/win32ss/gdi/gdi32/main/dllmain.c b/reactos/win32ss/gdi/gdi32/main/dllmain.c index d6521c374bd..0e34df29db9 100644 --- a/reactos/win32ss/gdi/gdi32/main/dllmain.c +++ b/reactos/win32ss/gdi/gdi32/main/dllmain.c @@ -18,7 +18,7 @@ extern CRITICAL_SECTION gcsClientObjLinks; */ BOOL WINAPI -DllMain ( +DllMain( HANDLE hDll, DWORD dwReason, LPVOID lpReserved) @@ -38,7 +38,7 @@ DllMain ( VOID WINAPI -GdiProcessSetup (VOID) +GdiProcessSetup(VOID) { hProcessHeap = GetProcessHeap(); @@ -53,36 +53,62 @@ GdiProcessSetup (VOID) 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; }