started moving tags to a private internal header
[reactos.git] / reactos / ntoskrnl / io / driver.c
index 0a4d108..a95a142 100644 (file)
@@ -76,9 +76,6 @@ static UNICODE_STRING IopHardwareDatabaseKey =
 
 POBJECT_TYPE EXPORTED IoDriverObjectType = NULL;
 
-#define TAG_DRIVER             TAG('D', 'R', 'V', 'R')
-#define TAG_DRIVER_EXTENSION   TAG('D', 'R', 'V', 'E')
-
 /* DECLARATIONS ***************************************************************/
 
 VOID STDCALL
@@ -151,6 +148,64 @@ IopDeleteDriver(PVOID ObjectBody)
    KfLowerIrql(OldIrql);
 }
 
+NTSTATUS FASTCALL
+IopGetDriverObject(
+   PDRIVER_OBJECT *DriverObject,
+   PUNICODE_STRING ServiceName,
+   BOOLEAN FileSystem)
+{
+   PDRIVER_OBJECT Object;
+   WCHAR NameBuffer[MAX_PATH];
+   UNICODE_STRING DriverName;
+   OBJECT_ATTRIBUTES ObjectAttributes;
+   NTSTATUS Status;
+
+   DPRINT("IopOpenDriverObject(%p '%wZ' %x)\n",
+      DriverObject, ServiceName, FileSystem);
+
+   *DriverObject = NULL;
+
+   /* Create ModuleName string */
+   if (ServiceName == NULL || ServiceName->Buffer == NULL)
+      /* We don't know which DriverObject we have to open */
+      return STATUS_INVALID_PARAMETER_2;
+
+   if (FileSystem == TRUE)
+      wcscpy(NameBuffer, FILESYSTEM_ROOT_NAME);
+   else
+      wcscpy(NameBuffer, DRIVER_ROOT_NAME);
+   wcscat(NameBuffer, ServiceName->Buffer);
+
+   RtlInitUnicodeString(&DriverName, NameBuffer);
+   DPRINT("Driver name: '%wZ'\n", &DriverName);
+
+   /* Initialize ObjectAttributes for driver object */
+   InitializeObjectAttributes(
+      &ObjectAttributes,
+      &DriverName,
+      OBJ_OPENIF | OBJ_KERNEL_HANDLE,
+      NULL,
+      NULL);
+
+   /* Open driver object */
+   Status = ObReferenceObjectByName(
+      &DriverName,
+      0, /* Attributes */
+      NULL, /* PassedAccessState */
+      0, /* DesiredAccess */
+      IoDriverObjectType,
+      KernelMode,
+      NULL, /* ParseContext */
+      (PVOID*)&Object);
+
+   if (!NT_SUCCESS(Status))
+      return Status;
+
+   *DriverObject = Object;
+
+   return STATUS_SUCCESS;
+}
+
 NTSTATUS FASTCALL
 IopCreateDriverObject(
    PDRIVER_OBJECT *DriverObject,
@@ -219,15 +274,18 @@ IopCreateDriverObject(
       return Status;
    }
 
-   if (Status == STATUS_OBJECT_EXISTS)
+   Status = ObInsertObject(Object,
+                           NULL,
+                           FILE_ALL_ACCESS,
+                           0,
+                           NULL,
+                           NULL);
+   if (!NT_SUCCESS(Status))
    {
-      /* The driver object already exists, so it is already
-       * initialized. Don't initialize it once more. */
-      *DriverObject = Object;
-      return STATUS_SUCCESS;
-   }
+      return Status;
+   }  
 
-     /* Create driver extension */
+   /* Create driver extension */
    Object->DriverExtension = (PDRIVER_EXTENSION)
       ExAllocatePoolWithTag(
          NonPagedPool,
@@ -639,13 +697,10 @@ IopAttachFilterDriversCallback(
       else
       {
          /* get existing DriverObject pointer */
-         Status = IopCreateDriverObject(
+         Status = IopGetDriverObject(
             &DriverObject,
             &ServiceName,
-            OBJ_OPENIF,
-            FALSE,
-            ModuleObject->Base,
-            ModuleObject->Length);
+            FALSE);
          if (!NT_SUCCESS(Status))
             continue;
       }