+IoRegisterDriverReinitialization()
authorshort <>
Mon, 24 Mar 2003 00:08:12 +0000 (00:08 +0000)
committershort <>
Mon, 24 Mar 2003 00:08:12 +0000 (00:08 +0000)
+reactos security subsystem initialization

src/libcaptive/client/init.c

index 14903ac..844d3ea 100644 (file)
@@ -45,6 +45,7 @@
 #include <glib/gutils.h>       /* for g_atexit() */
 #include "giochannel-blind.h"
 #include <glib-object.h>
+#include "reactos/internal/se.h"       /* for SeInit2() */
 
 
 /* Are we initialized? */
@@ -54,7 +55,9 @@ static gboolean active;
 static PMODULE_OBJECT ModuleObject;
 
 /* Driver in fs module loaded by captive_w32_init() */
-static DRIVER_OBJECT DriverObject;
+DRIVER_OBJECT captive_DriverObject;
+PDRIVER_REINITIALIZE captive_DriverObject_ReinitRoutine;
+PVOID captive_DriverObject_ReinitRoutine_Context;
 
 /* Structure holding the pointer to the toplevel IRP */
 static TOP_LEVEL_IRP TopLevelIrp;      /* TODO:thread */
@@ -215,13 +218,15 @@ GIOStatus erriostatus;
                        /* Part of reactos/ntoskrnl/ldr/loader.c/LdrInit1() ends. */
                KeLowerIrql(DISPATCH_LEVEL);
                /*...*/
-               KeLowerIrql(PASSIVE_LEVEL);
-               /*...*/
                /* create default nls tables */
                RtlpInitNlsTables();
                /*...*/
+               KeLowerIrql(PASSIVE_LEVEL);
+               errbool=SeInit1();
+               g_assert(errbool==TRUE);
                ObInit();
-               /*...*/
+               errbool=SeInit2();
+               g_assert(errbool==TRUE);
                /* PiInitProcessManager(); */
                        /* Part of reactos/ntoskrnl/ps/psmgr.c/PiInitProcessManager() begins. */
                        PsInitProcessManagment();
@@ -285,12 +290,19 @@ NTSTATUS err;
        /* You must have already captive_signal_init() passed here as the module may
         * call some functions from W32 ntoskrnl.exe.
         */
+       captive_DriverObject_ReinitRoutine=NULL;
        err=captive_LdrpLoadAndCallImage(
                        &ModuleObject,  /* ModuleObjectp */
                        captive_utf8_to_UnicodeString_alloca(captive_option_filesystem),        /* ModuleName */
-                       &DriverObject,  /* DriverEntry_DriverObject */
+                       &captive_DriverObject,  /* DriverEntry_DriverObject */
                        captive_utf8_to_UnicodeString_alloca("\\captive\\filesystem")); /* DriverEntry_RegistryPath */
        g_return_val_if_fail(NT_SUCCESS(err),FALSE);
+       if (captive_DriverObject_ReinitRoutine) {
+               (*captive_DriverObject_ReinitRoutine)(
+                               &captive_DriverObject,  /* DriverObject */
+                               captive_DriverObject_ReinitRoutine_Context,     /* Context */
+                               1);     /* Count: # of calls of ReinitRoutine incl. the current one */
+               }
 
        return TRUE;
 }
@@ -441,6 +453,8 @@ GIOStatus erriostatus;
        g_return_val_if_fail(active==TRUE,FALSE);
        g_return_val_if_fail(captive_image_iochannel!=NULL,FALSE);
 
+       captive_PoQueueShutdownWorkItem_hooklist_invoke();
+
        /* FIXME: ntoskrnl/ex/power.c/NtShutdownSystem() does
         * IoShutdownRegistered{Devices,FileSystems} order; is it correct?
         */