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@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?rev... = = = = = = = = ====================================================================== --- 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 */
Best regards, Alex Ionescu