[Win32k]
authorJames Tabor <james.tabor@reactos.org>
Fri, 20 Nov 2015 08:22:20 +0000 (08:22 +0000)
committerJames Tabor <james.tabor@reactos.org>
Fri, 20 Nov 2015 08:22:20 +0000 (08:22 +0000)
- Fix crash while closing global hooked application. See CORE-10549.

svn path=/trunk/; revision=69945

reactos/win32ss/user/ntuser/callback.c
reactos/win32ss/user/ntuser/hook.c

index e233c07..2f3ea96 100644 (file)
@@ -647,7 +647,13 @@ co_IntCallHookProc(INT HookId,
    Common->offPfn = offPfn;
    Common->Ansi = Ansi;
    RtlZeroMemory(&Common->ModuleName, sizeof(Common->ModuleName));
    Common->offPfn = offPfn;
    Common->Ansi = Ansi;
    RtlZeroMemory(&Common->ModuleName, sizeof(Common->ModuleName));
-   RtlCopyMemory(&Common->ModuleName, ModuleName->Buffer, ModuleName->Length);
+   if (ModuleName->Buffer && ModuleName->Length)
+   {
+      RtlCopyMemory(&Common->ModuleName, ModuleName->Buffer, ModuleName->Length);
+      // If ModuleName->Buffer NULL while in destroy,
+      //    this will make User32:Hook.c complain about not loading the library module.
+      // Fix symptom for CORE-10549.
+   }
    Extra = (PCHAR) Common + sizeof(HOOKPROC_CALLBACK_ARGUMENTS);
 
    switch(HookId)
    Extra = (PCHAR) Common + sizeof(HOOKPROC_CALLBACK_ARGUMENTS);
 
    switch(HookId)
@@ -738,7 +744,7 @@ co_IntCallHookProc(INT HookId,
 
    if (!NT_SUCCESS(Status))
    {
 
    if (!NT_SUCCESS(Status))
    {
-      ERR("Failure to make Callback! Status 0x%x",Status);
+      ERR("Failure to make Callback! Status 0x%x\n",Status);
       goto Fault_Exit;
    }
 
       goto Fault_Exit;
    }
 
index c77959f..6415509 100644 (file)
@@ -342,6 +342,9 @@ co_CallHook( INT HookId,
        case WH_KEYBOARD:
           break;
     }
        case WH_KEYBOARD:
           break;
     }
+
+    if (!UserObjectInDestroy(UserHMGetHandle(phk))) //// Fix CORE-10549.
+    {
     /* The odds are high for this to be a Global call. */
     Result = co_IntCallHookProc( HookId,
                                  Code,
     /* The odds are high for this to be a Global call. */
     Result = co_IntCallHookProc( HookId,
                                  Code,
@@ -352,7 +355,7 @@ co_CallHook( INT HookId,
                                  phk->offPfn,
                                  phk->Ansi,
                                 &phk->ModuleName);
                                  phk->offPfn,
                                  phk->Ansi,
                                 &phk->ModuleName);
-
+    }
     /* The odds so high, no one is waiting for the results. */
     if (pHP->pHookStructs) ExFreePoolWithTag(pHP->pHookStructs, TAG_HOOK);
     ExFreePoolWithTag(pHP, TAG_HOOK);
     /* The odds so high, no one is waiting for the results. */
     if (pHP->pHookStructs) ExFreePoolWithTag(pHP->pHookStructs, TAG_HOOK);
     ExFreePoolWithTag(pHP, TAG_HOOK);