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