Don't call DriverEntry more than once. Fix suggested by Filip Navara.
authorHervé Poussineau <hpoussin@reactos.org>
Mon, 11 Apr 2005 22:29:31 +0000 (22:29 +0000)
committerHervé Poussineau <hpoussin@reactos.org>
Mon, 11 Apr 2005 22:29:31 +0000 (22:29 +0000)
svn path=/trunk/; revision=14594

reactos/ntoskrnl/include/internal/io.h
reactos/ntoskrnl/io/driver.c
reactos/ntoskrnl/io/pnpmgr.c

index 60425c5..6c6b41f 100644 (file)
@@ -478,6 +478,7 @@ NTSTATUS FASTCALL
 IopCreateDriverObject(
    PDRIVER_OBJECT *DriverObject,
    PUNICODE_STRING ServiceName,
 IopCreateDriverObject(
    PDRIVER_OBJECT *DriverObject,
    PUNICODE_STRING ServiceName,
+   ULONG CreateAttributes,
    BOOLEAN FileSystemDriver,
    PVOID DriverImageStart,
    ULONG DriverImageSize);
    BOOLEAN FileSystemDriver,
    PVOID DriverImageStart,
    ULONG DriverImageSize);
index 0f58a3e..ca3a89e 100644 (file)
@@ -199,6 +199,7 @@ NTSTATUS FASTCALL
 IopCreateDriverObject(
    PDRIVER_OBJECT *DriverObject,
    PUNICODE_STRING ServiceName,
 IopCreateDriverObject(
    PDRIVER_OBJECT *DriverObject,
    PUNICODE_STRING ServiceName,
+   ULONG CreateAttributes,
    BOOLEAN FileSystem,
    PVOID DriverImageStart,
    ULONG DriverImageSize)
    BOOLEAN FileSystem,
    PVOID DriverImageStart,
    ULONG DriverImageSize)
@@ -240,7 +241,7 @@ IopCreateDriverObject(
    InitializeObjectAttributes(
       &ObjectAttributes,
       &DriverName,
    InitializeObjectAttributes(
       &ObjectAttributes,
       &DriverName,
-      OBJ_PERMANENT,
+      CreateAttributes | OBJ_PERMANENT,
       NULL,
       NULL);
 
       NULL,
       NULL);
 
@@ -265,9 +266,14 @@ IopCreateDriverObject(
    Object->DriverSize = DriverImageSize;
    if (Buffer)
    {
    Object->DriverSize = DriverImageSize;
    if (Buffer)
    {
-      Object->DriverName.Buffer = Buffer;
-      Object->DriverName.Length = Object->DriverName.MaximumLength = DriverName.Length;
-      RtlCopyMemory(Object->DriverName.Buffer, DriverName.Buffer, DriverName.Length);
+      if (!Object->DriverName.Buffer)
+      {
+         Object->DriverName.Buffer = Buffer;
+         Object->DriverName.Length = Object->DriverName.MaximumLength = DriverName.Length;
+         RtlCopyMemory(Object->DriverName.Buffer, DriverName.Buffer, DriverName.Length);
+      }
+      else
+         ExFreePool(Buffer);
    }
 
    *DriverObject = Object;
    }
 
    *DriverObject = Object;
@@ -479,7 +485,7 @@ IopLoadServiceModule(
    else
    {
       DPRINT("Module already loaded\n");
    else
    {
       DPRINT("Module already loaded\n");
-      Status = STATUS_SUCCESS;
+      Status = STATUS_IMAGE_ALREADY_LOADED;
    }
 
    RtlFreeUnicodeString(&ServiceImagePath);
    }
 
    RtlFreeUnicodeString(&ServiceImagePath);
@@ -538,6 +544,7 @@ IopInitializeDriverModule(
    Status = IopCreateDriverObject(
       DriverObject,
       ServiceName,
    Status = IopCreateDriverObject(
       DriverObject,
       ServiceName,
+      0,
       FileSystemDriver,
       ModuleObject->Base,
       ModuleObject->Length);
       FileSystemDriver,
       ModuleObject->Base,
       ModuleObject->Length);
@@ -614,13 +621,29 @@ IopAttachFilterDriversCallback(
 
       /* Load and initialize the filter driver */
       Status = IopLoadServiceModule(&ServiceName, &ModuleObject);
 
       /* Load and initialize the filter driver */
       Status = IopLoadServiceModule(&ServiceName, &ModuleObject);
-      if (!NT_SUCCESS(Status))
-         continue;
+      if (Status != STATUS_IMAGE_ALREADY_LOADED)
+      {
+         if (!NT_SUCCESS(Status))
+            continue;
 
 
-      Status = IopInitializeDriverModule(DeviceNode, ModuleObject, &ServiceName,
-                                         FALSE, &DriverObject);
-      if (!NT_SUCCESS(Status))
-         continue;
+         Status = IopInitializeDriverModule(DeviceNode, ModuleObject, &ServiceName,
+                                            FALSE, &DriverObject);
+         if (!NT_SUCCESS(Status))
+            continue;
+      }
+      else
+      {
+         /* get existing DriverObject pointer */
+         Status = IopCreateDriverObject(
+            &DriverObject,
+            &ServiceName,
+            OBJ_OPENIF,
+            FALSE,
+            ModuleObject->Base,
+            ModuleObject->Length);
+         if (!NT_SUCCESS(Status))
+            continue;
+      }
 
       Status = IopInitializeDevice(DeviceNode, DriverObject);
       if (!NT_SUCCESS(Status))
 
       Status = IopInitializeDevice(DeviceNode, DriverObject);
       if (!NT_SUCCESS(Status))
index a19f0e7..e06433b 100644 (file)
@@ -1499,10 +1499,22 @@ IopActionInitChildServices(
       PDRIVER_OBJECT DriverObject;
 
       Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject);
       PDRIVER_OBJECT DriverObject;
 
       Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject);
-      if (NT_SUCCESS(Status))
+      if (NT_SUCCESS(Status) || Status == STATUS_IMAGE_ALREADY_LOADED)
       {
       {
-         Status = IopInitializeDriverModule(DeviceNode, ModuleObject,
-            &DeviceNode->ServiceName, FALSE, &DriverObject);
+         if (Status != STATUS_IMAGE_ALREADY_LOADED)
+            Status = IopInitializeDriverModule(DeviceNode, ModuleObject,
+               &DeviceNode->ServiceName, FALSE, &DriverObject);
+         else
+         {
+            /* get existing DriverObject pointer */
+            Status = IopCreateDriverObject(
+               &DriverObject,
+               &DeviceNode->ServiceName,
+               OBJ_OPENIF,
+               FALSE,
+               ModuleObject->Base,
+               ModuleObject->Length);
+         }
          if (NT_SUCCESS(Status))
          {
             /* Attach lower level filter drivers. */
          if (NT_SUCCESS(Status))
          {
             /* Attach lower level filter drivers. */
@@ -1787,7 +1799,7 @@ PnpInit(VOID)
     * Create root device node
     */
 
     * Create root device node
     */
 
-   Status = IopCreateDriverObject(&IopRootDriverObject, NULL, FALSE, NULL, 0);
+   Status = IopCreateDriverObject(&IopRootDriverObject, NULL, 0, FALSE, NULL, 0);
    if (!NT_SUCCESS(Status))
    {
       CPRINT("IoCreateDriverObject() failed\n");
    if (!NT_SUCCESS(Status))
    {
       CPRINT("IoCreateDriverObject() failed\n");