[NTOSKRNL] Implement the support for reserve IRP in IO
[reactos.git] / ntoskrnl / io / iomgr / iomgr.c
index fe86ac9..47defca 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS Kernel
- * FILE:            ntoskrnl/io/iomgr.c
+ * FILE:            ntoskrnl/io/iomgr/iomgr.c
  * PURPOSE:         I/O Manager Initialization and Misc Utility Functions
  *
  * PROGRAMMERS:     David Welch (welch@mcmail.com)
@@ -25,12 +25,16 @@ IopTimerDispatch(
     IN PVOID SystemArgument2
 );
 
+BOOLEAN
+NTAPI
+WmiInitialize(
+    VOID);
+
 /* DATA ********************************************************************/
 
 POBJECT_TYPE IoDeviceObjectType = NULL;
 POBJECT_TYPE IoFileObjectType = NULL;
 extern POBJECT_TYPE IoControllerObjectType;
-extern UNICODE_STRING NtSystemRoot;
 BOOLEAN IoCountOperations = TRUE;
 ULONG IoReadOperationCount = 0;
 LARGE_INTEGER IoReadTransferCount = {{0, 0}};
@@ -54,6 +58,7 @@ extern KSPIN_LOCK ShutdownListLock;
 extern POBJECT_TYPE IoAdapterObjectType;
 extern ERESOURCE IopDatabaseResource;
 ERESOURCE IopSecurityResource;
+extern ERESOURCE IopDriverLoadResource;
 extern KGUARDED_MUTEX PnpNotifyListLock;
 extern LIST_ENTRY IopDiskFileSystemQueueHead;
 extern LIST_ENTRY IopCdRomFileSystemQueueHead;
@@ -110,7 +115,7 @@ IopInitLookasideLists(VOID)
                                     IOC_TAG1,
                                     32,
                                     &ExSystemLookasideListHead);
-    
+
     /* Initialize the Lookaside List for Large IRPs */
     ExInitializeSystemLookasideList(&IoLargeIrpLookaside,
                                     NonPagedPool,
@@ -137,11 +142,11 @@ IopInitLookasideLists(VOID)
                                     &ExSystemLookasideListHead);
 
     /* Allocate the global lookaside list buffer */
-    CurrentList = ExAllocatePoolWithTag(NonPagedPool, 
+    CurrentList = ExAllocatePoolWithTag(NonPagedPool,
                                         4 * KeNumberProcessors *
                                         sizeof(GENERAL_LOOKASIDE),
                                         TAG_IO);
-    
+
     /* Loop all processors */
     for (i = 0; i < KeNumberProcessors; i++)
     {
@@ -165,13 +170,13 @@ IopInitLookasideLists(VOID)
                                             &ExSystemLookasideListHead);
             Prcb->PPLookasideList[LookasideCompletionList].P = CurrentList;
             CurrentList++;
-            
+
         }
         else
         {
             Prcb->PPLookasideList[LookasideCompletionList].P = &IoCompletionPacketLookaside;
         }
-        
+
         /* Set the Large IRP List */
         Prcb->PPLookasideList[LookasideLargeIrpList].L = &IoLargeIrpLookaside;
         if (CurrentList)
@@ -185,7 +190,7 @@ IopInitLookasideLists(VOID)
                                             &ExSystemLookasideListHead);
             Prcb->PPLookasideList[LookasideLargeIrpList].P = CurrentList;
             CurrentList++;
-            
+
         }
         else
         {
@@ -205,7 +210,7 @@ IopInitLookasideLists(VOID)
                                             &ExSystemLookasideListHead);
             Prcb->PPLookasideList[LookasideSmallIrpList].P = CurrentList;
             CurrentList++;
-            
+
         }
         else
         {
@@ -223,10 +228,10 @@ IopInitLookasideLists(VOID)
                                             TAG_MDL,
                                             128,
                                             &ExSystemLookasideListHead);
-            
+
             Prcb->PPLookasideList[LookasideMdlList].P = CurrentList;
             CurrentList++;
-            
+
         }
         else
         {
@@ -272,7 +277,7 @@ IopCreateObjectTypes(VOID)
     ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DEVICE_OBJECT);
     ObjectTypeInitializer.DeleteProcedure = IopDeleteDevice;
     ObjectTypeInitializer.ParseProcedure = IopParseDevice;
-    ObjectTypeInitializer.SecurityProcedure = IopSecurityFile;
+    ObjectTypeInitializer.SecurityProcedure = IopGetSetSecurityObject;
     ObjectTypeInitializer.CaseInsensitive = TRUE;
     if (!NT_SUCCESS(ObCreateObjectType(&Name,
                                        &ObjectTypeInitializer,
@@ -311,7 +316,7 @@ IopCreateObjectTypes(VOID)
     ObjectTypeInitializer.GenericMapping = IopFileMapping;
     ObjectTypeInitializer.CloseProcedure = IopCloseFile;
     ObjectTypeInitializer.DeleteProcedure = IopDeleteFile;
-    ObjectTypeInitializer.SecurityProcedure = IopSecurityFile;
+    ObjectTypeInitializer.SecurityProcedure = IopGetSetSecurityObject;
     ObjectTypeInitializer.QueryNameProcedure = IopQueryNameFile;
     ObjectTypeInitializer.ParseProcedure = IopParseFile;
     ObjectTypeInitializer.UseDefaultObject = FALSE;
@@ -327,11 +332,12 @@ IopCreateObjectTypes(VOID)
 BOOLEAN
 INIT_FUNCTION
 NTAPI
-IopCreateRootDirectories()
+IopCreateRootDirectories(VOID)
 {
     OBJECT_ATTRIBUTES ObjectAttributes;
     UNICODE_STRING DirName;
     HANDLE Handle;
+    NTSTATUS Status;
 
     /* Create the '\Driver' object directory */
     RtlInitUnicodeString(&DirName, L"\\Driver");
@@ -340,9 +346,14 @@ IopCreateRootDirectories()
                                OBJ_PERMANENT,
                                NULL,
                                NULL);
-    if (!NT_SUCCESS(NtCreateDirectoryObject(&Handle,
-                                            DIRECTORY_ALL_ACCESS,
-                                            &ObjectAttributes))) return FALSE;
+    Status = NtCreateDirectoryObject(&Handle,
+                                     DIRECTORY_ALL_ACCESS,
+                                     &ObjectAttributes);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Failed to create \\Driver directory: 0x%lx\n", Status);
+        return FALSE;
+    }
     NtClose(Handle);
 
     /* Create the '\FileSystem' object directory */
@@ -352,9 +363,31 @@ IopCreateRootDirectories()
                                OBJ_PERMANENT,
                                NULL,
                                NULL);
-    if (!NT_SUCCESS(NtCreateDirectoryObject(&Handle,
-                                            DIRECTORY_ALL_ACCESS,
-                                            &ObjectAttributes))) return FALSE;
+    Status = NtCreateDirectoryObject(&Handle,
+                                     DIRECTORY_ALL_ACCESS,
+                                     &ObjectAttributes);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Failed to create \\FileSystem directory: 0x%lx\n", Status);
+        return FALSE;
+    }
+    NtClose(Handle);
+
+    /* Create the '\FileSystem' object directory */
+    RtlInitUnicodeString(&DirName, L"\\FileSystem\\Filters");
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &DirName,
+                               OBJ_PERMANENT,
+                               NULL,
+                               NULL);
+    Status = NtCreateDirectoryObject(&Handle,
+                                     DIRECTORY_ALL_ACCESS,
+                                     &ObjectAttributes);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Failed to create \\FileSystem\\Filters directory: 0x%lx\n", Status);
+        return FALSE;
+    }
     NtClose(Handle);
 
     /* Return success */
@@ -448,8 +481,9 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     IopInitLookasideLists();
 
     /* Initialize all locks and lists */
-    ExInitializeResource(&IopDatabaseResource);
-    ExInitializeResource(&IopSecurityResource);
+    ExInitializeResourceLite(&IopDatabaseResource);
+    ExInitializeResourceLite(&IopSecurityResource);
+    ExInitializeResourceLite(&IopDriverLoadResource);
     KeInitializeGuardedMutex(&PnpNotifyListLock);
     InitializeListHead(&IopDiskFileSystemQueueHead);
     InitializeListHead(&IopCdRomFileSystemQueueHead);
@@ -468,6 +502,13 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     KeInitializeSpinLock(&ShutdownListLock);
     KeInitializeSpinLock(&IopLogListLock);
 
+    /* Initialize the reserve IRP */
+    if (!IopInitializeReserveIrp(&IopReserveIrpAllocator))
+    {
+        DPRINT1("IopInitializeReserveIrp failed!\n");
+        return FALSE;
+    }
+
     /* Initialize Timer List Lock */
     KeInitializeSpinLock(&IopTimerLock);
 
@@ -497,6 +538,12 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     /* Initialize PnP manager */
     IopInitializePlugPlayServices();
 
+    /* Initialize SHIM engine */
+    ApphelpCacheInitialize();
+
+    /* Initialize WMI */
+    WmiInitialize();
+
     /* Initialize HAL Root Bus Driver */
     HalInitPnpDriver();