Author: gadamopoulos
Date: Thu Jul 14 08:37:55 2011
New Revision: 52675

URL: http://svn.reactos.org/svn/reactos?rev=52675&view=rev
Log:
[win32k]
- Fix a bug that caused ClientLoadLibrary to be called recursively

Modified:
    branches/GSoC_2011/ThemesSupport/subsystems/win32/win32k/ntuser/hook.c

Modified: branches/GSoC_2011/ThemesSupport/subsystems/win32/win32k/ntuser/hook.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/ThemesSupport/subsystems/win32/win32k/ntuser/hook.c?rev=52675&r1=52674&r2=52675&view=diff
==============================================================================
--- branches/GSoC_2011/ThemesSupport/subsystems/win32/win32k/ntuser/hook.c 
[iso-8859-1] (original)
+++ branches/GSoC_2011/ThemesSupport/subsystems/win32/win32k/ntuser/hook.c 
[iso-8859-1] Thu Jul 14 08:37:55 2011
@@ -46,14 +46,22 @@
     {
         if(!Unload && !(ppi->W32PF_flags & W32PF_APIHOOKLOADED))
         {
+            /* A callback in user mode can trigger UserLoadApiHook to be 
called and 
+               as a result IntLoadHookModule will be called recursively.
+               To solve this we set the flag that means that the appliaction 
has
+               loaded the api hook before the callback and in case of error we 
remove it */
+            ppi->W32PF_flags |= W32PF_APIHOOKLOADED;
+
             /* Call ClientLoadLibrary in user32 */
             hmod = co_IntClientLoadLibrary(&strUahModule, &strUahInitFunc, 
Unload, TRUE);
-            if(hmod != 0)
+            DPRINT1("co_IntClientLoadLibrary returned %d\n", hmod );
+            if(hmod == 0)
             {
-                ppi->W32PF_flags |= W32PF_APIHOOKLOADED;
-                return TRUE;
-            }
-            return FALSE;
+                /* Remove the flag we set before */
+                ppi->W32PF_flags &= ~W32PF_APIHOOKLOADED;
+                return FALSE;
+            }
+            return TRUE;
         }
         else if(Unload && (ppi->W32PF_flags & W32PF_APIHOOKLOADED))
         {
@@ -91,7 +99,7 @@
     ULONG_PTR Result;
     PPROCESSINFO ppiCsr;
     
-    DPRINT("IntHookModuleUnloaded: iHookID=%d\n", iHookID);
+    DPRINT1("IntHookModuleUnloaded: iHookID=%d\n", iHookID);
 
     ppiCsr = PsGetProcessWin32Process(CsrProcess);
 
@@ -155,7 +163,7 @@
         return FALSE;
     }
 
-    DPRINT("UserRegisterUserApiHook. Server PID: %d\n", 
PsGetProcessId(pti->ppi->peProcess));
+    DPRINT1("UserRegisterUserApiHook. Server PID: %d\n", 
PsGetProcessId(pti->ppi->peProcess));
 
     /* Register the api hook */
     gpsi->dwSRVIFlags |= SRVINFO_APIHOOK;


Reply via email to