This is incorrect behavior, the terminate should be instant. This will
likely cause bugs in the user-mode debugging framework.
On 26-Jan-08, at 4:20 AM, arty(a)svn.reactos.org wrote:
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?re…
=
=
=
=
=
=
=
=
======================================================================
--- 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 */