- Prevent kernel bug check in win32k when calling a hook proc when thread is in cleanup.
authorJames Tabor <james.tabor@reactos.org>
Sat, 3 Oct 2009 02:30:47 +0000 (02:30 +0000)
committerJames Tabor <james.tabor@reactos.org>
Sat, 3 Oct 2009 02:30:47 +0000 (02:30 +0000)
- This is not a hack and not a fix. Please retest related bug report applications. Tested Firefox 3.5 and the new putty. Need new debug print outs. ATM Ff 3.5 send out WH_JOURNALRECORD hook calls when the thread is in cleanup. Look like this: Thread is in cleanup and trying to call hook 0
- Reference bug 4298.

svn path=/trunk/; revision=43259

reactos/subsystems/win32/win32k/main/dllmain.c
reactos/subsystems/win32/win32k/ntuser/callback.c
reactos/subsystems/win32/win32k/ntuser/window.c

index 51a9bd4..84b92bf 100644 (file)
@@ -16,8 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id$
- *
+/*
  *  Entry Point for win32k.sys
  */
 
@@ -285,6 +284,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
       DPRINT("Destroying W32 thread TID:%d at IRQ level: %lu\n", Thread->Cid.UniqueThread, KeGetCurrentIrql());
 
       Win32Thread->IsExiting = TRUE;
+      Win32Thread->TIF_flags |= TIF_INCLEANUP;
       HOOK_DestroyThreadHooks(Thread);
       UnregisterThreadHotKeys(Thread);
       /* what if this co_ func crash in umode? what will clean us up then? */
index 69715c9..b8a8eb0 100644 (file)
@@ -326,6 +326,14 @@ co_IntCallHookProc(INT HookId,
    UNICODE_STRING ClassName;
    PANSI_STRING asWindowName;
    PANSI_STRING asClassName;
+   PTHREADINFO pti;
+
+   pti = PsGetCurrentThreadWin32Thread();
+   if (pti->TIF_flags & TIF_INCLEANUP)
+   {
+      DPRINT1("Thread is in cleanup and trying to call hook %d\n", Code);
+      return 0;
+   }
 
    ArgumentLength = sizeof(HOOKPROC_CALLBACK_ARGUMENTS) - sizeof(WCHAR)
                     + ModuleName->Length;
index d1b8618..896a9f9 100644 (file)
@@ -425,6 +425,7 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window,
          co_IntSendMessage(Window->hSelf, WM_NCDESTROY, 0, 0);
    }
    MsqRemoveTimersWindow(ThreadData->MessageQueue, Window->hSelf);
+   HOOK_DestroyThreadHooks(ThreadData->pEThread); // This is needed here too!
 
    /* flush the message queue */
    MsqRemoveWindowMessagesFromQueue(Window);