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