[ros-diffs] [arty] 32007: Fix termination of process under debug.

arty at svn.reactos.org arty at svn.reactos.org
Sat Jan 26 10:20:57 CET 2008


Author: arty
Date: Sat Jan 26 12:20:56 2008
New Revision: 32007

URL: http://svn.reactos.org/svn/reactos?rev=32007&view=rev
Log:
Fix termination of process under debug.

Modified:
    trunk/reactos/ntoskrnl/dbgk/dbgkobj.c

Modified: trunk/reactos/ntoskrnl/dbgk/dbgkobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/dbgk/dbgkobj.c?rev=32007&r1=32006&r2=32007&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/dbgk/dbgkobj.c (original)
+++ trunk/reactos/ntoskrnl/dbgk/dbgkobj.c Sat Jan 26 12:20:56 2008
@@ -1065,6 +1065,17 @@
 
 VOID
 NTAPI
+DbgkpDelayedTerminateProcess(PVOID Arg)
+{
+    PWORK_QUEUE_ITEM WorkItem = (PWORK_QUEUE_ITEM)Arg;
+    PEPROCESS OwnerProcess = *((PEPROCESS *)&WorkItem[1]);
+    ExFreePool(WorkItem);
+    /* Terminate the process */
+    PsTerminateProcess(OwnerProcess, STATUS_DEBUGGER_INACTIVE);
+}
+
+VOID
+NTAPI
 DbgkpCloseObject(IN PEPROCESS OwnerProcess OPTIONAL,
                  IN PVOID ObjectBody,
                  IN ACCESS_MASK GrantedAccess,
@@ -1079,6 +1090,8 @@
     DBGKTRACE(DBGK_OBJECT_DEBUG, "OwnerProcess: %p DebugObject: %p\n",
               OwnerProcess, DebugObject);
 
+    DPRINT("APC DISABLE: %d\n", ((PETHREAD)KeGetCurrentThread())->Tcb.CombinedApcDisable);
+
     /* If this isn't the last handle, do nothing */
     if (SystemHandleCount > 1) return;
 
@@ -1127,8 +1140,16 @@
                 /* Check if we terminate on exit */
                 if (DebugObject->KillProcessOnExit)
                 {
-                    /* Terminate the process */
-                    PsTerminateProcess(OwnerProcess, STATUS_DEBUGGER_INACTIVE);
+                    PWORK_QUEUE_ITEM WorkItem =
+                        ExAllocatePool
+                        (NonPagedPool, 
+                         sizeof(WORK_QUEUE_ITEM) + sizeof(PVOID));
+                    ExInitializeWorkItem
+                        (WorkItem, 
+                         DbgkpDelayedTerminateProcess,
+                         WorkItem);
+                    *((PEPROCESS *)&WorkItem[1]) = OwnerProcess;
+                    ExQueueWorkItem(WorkItem, CriticalWorkQueue);
                 }
 
                 /* Dereference the debug object */




More information about the Ros-diffs mailing list