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 */