[NTOS]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 4 Jul 2016 22:27:35 +0000 (22:27 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 4 Jul 2016 22:27:35 +0000 (22:27 +0000)
- Document ObKillProcess.
- Implement and document ObClearProcessHandleTable (based on ObKillProcess).

svn path=/trunk/; revision=71816

reactos/ntoskrnl/ob/obhandle.c

index 60b717d..f53ba78 100644 (file)
@@ -2004,17 +2004,69 @@ ObpDuplicateHandleCallback(IN PEPROCESS Process,
     return Ret;
 }
 
+/*++
+* @name ObClearProcessHandleTable
+*
+*     The ObClearProcessHandleTable routine clears the handle table
+*     of the given process.
+*
+* @param Process
+*        The process of which the handle table should be cleared.
+*
+* @return None.
+*
+* @remarks None.
+*
+*--*/
 VOID
 NTAPI
 ObClearProcessHandleTable(IN PEPROCESS Process)
 {
-    /* FIXME */
+    PHANDLE_TABLE HandleTable;
+    OBP_CLOSE_HANDLE_CONTEXT Context;
+    KAPC_STATE ApcState;
+    BOOLEAN AttachedToProcess = FALSE;
+
+    ASSERT(Process);
+
+    /* Ensure the handle table doesn't go away while we use it */
+    HandleTable = ObReferenceProcessHandleTable(Process);
+    if (!HandleTable) return;
+
+    /* Attach to the current process if needed */
+    if (PsGetCurrentProcess() != Process)
+    {
+        KeStackAttachProcess(&Process->Pcb, &ApcState);
+        AttachedToProcess = TRUE;
+    }
+
+    /* Enter a critical region */
+    KeEnterCriticalRegion();
+
+    /* Fill out the context */
+    Context.AccessMode = UserMode;
+    Context.HandleTable = HandleTable;
+
+    /* Sweep the handle table to close all handles */
+    ExSweepHandleTable(HandleTable,
+                       ObpCloseHandleCallback,
+                       &Context);
+
+    /* Leave the critical region */
+    KeLeaveCriticalRegion();
+
+    /* Detach if needed */
+    if (AttachedToProcess)
+        KeUnstackDetachProcess(&ApcState);
+
+    /* Let the handle table go */
+    ObDereferenceProcessHandleTable(Process);
 }
 
 /*++
-* @name ObpCreateHandleTable
+* @name ObInitProcess
 *
-*     The ObpCreateHandleTable routine <FILLMEIN>
+*     The ObInitProcess routine <FILLMEIN>
 *
 * @param Parent
 *        <FILLMEIN>.
@@ -2085,14 +2137,16 @@ ObInitProcess(IN PEPROCESS Parent OPTIONAL,
 /*++
 * @name ObKillProcess
 *
-*     The ObKillProcess routine <FILLMEIN>
+*     The ObKillProcess routine performs rundown operations on the process,
+*     then clears and destroys its handle table.
 *
 * @param Process
-*        <FILLMEIN>.
+*        The process to be killed.
 *
 * @return None.
 *
-* @remarks None.
+* @remarks Called by the Object Manager cleanup code (kernel)
+*          when a process is to be destroyed.
 *
 *--*/
 VOID