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/dllmain.c?rev=65797&r1=65796&r2=65797&view=diff
==============================================================================
--- 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;
     }
 


Reply via email to