[ros-diffs] [fireball] 26891: - Remove a hack from IopCreateDriver(), no boot hang happens in VMWare without it anymore. - Uncomment a ExFreePool() in a Delete routine for Driver object type, should prevent a possible memory leak (was commented due to the previous hack). - Added a small piece of a new logic into IopCreateDriver(). In ReactOS it's being called two times almost immediately, which results in a non-unique driver object name, since KeTickCount is the same. In order to prevent this situation a loop is added, having 100 iterations as max.

fireball at svn.reactos.org fireball at svn.reactos.org
Fri May 25 15:52:58 CEST 2007


Author: fireball
Date: Fri May 25 17:52:58 2007
New Revision: 26891

URL: http://svn.reactos.org/svn/reactos?rev=26891&view=rev
Log:
- Remove a hack from IopCreateDriver(), no boot hang happens in VMWare without it anymore.
- Uncomment a ExFreePool() in a Delete routine for Driver object type, should prevent a possible memory leak (was commented due to the previous hack).
- Added a small piece of a new logic into IopCreateDriver(). In ReactOS it's being called two times almost immediately, which results in a non-unique driver object name, since KeTickCount is the same. In order to prevent this situation a loop is added, having 100 iterations as max.

Modified:
    trunk/reactos/ntoskrnl/io/iomgr/driver.c

Modified: trunk/reactos/ntoskrnl/io/iomgr/driver.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/driver.c?rev=26891&r1=26890&r2=26891&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/driver.c (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/driver.c Fri May 25 17:52:58 2007
@@ -83,7 +83,7 @@
     if (DriverObject->DriverExtension->ServiceKeyName.Buffer)
     {
         /* Free it */
-        //ExFreePool(DriverObject->DriverExtension->ServiceKeyName.Buffer);
+        ExFreePool(DriverObject->DriverExtension->ServiceKeyName.Buffer);
     }
 }
 
@@ -443,6 +443,7 @@
 
    if (!NT_SUCCESS(Status))
    {
+      DPRINT1("DriverEntry() returned Status=0x%08X\n", Status);
       ObMakeTemporaryObject(Driver);
       ObDereferenceObject(Driver);
       return Status;
@@ -1119,8 +1120,9 @@
     PDRIVER_OBJECT DriverObject;
     UNICODE_STRING ServiceKeyName;
     HANDLE hDriver;
-    ULONG i;
-
+    ULONG i, RetryCount = 0;
+
+try_again:
     /* First, create a unique name for the driver if we don't have one */
     if (!DriverName)
     {
@@ -1201,21 +1203,22 @@
                   &ServiceKeyName,
                   sizeof(UNICODE_STRING));
 
-    if (!DriverName)
-    {
-        /* HACK: Something goes wrong in next lines in this case.
-         * Just leave to prevent a freeze */
-        *pDriverObject = DriverObject;
-        return Status;
-    }
-
     /* Add the Object and get its handle */
     Status = ObInsertObject(DriverObject,
                             NULL,
                             FILE_READ_DATA,
-                            0,
+                            OBJ_KERNEL_HANDLE,
                             NULL,
                             &hDriver);
+
+    /* Eliminate small possibility when this function is called more than
+       once in a row, and KeTickCount doesn't get enough time to change */
+    if (!DriverName && (Status == STATUS_OBJECT_NAME_COLLISION) && (RetryCount < 100))
+    {
+        RetryCount++;
+        goto try_again;
+    }
+
     if (!NT_SUCCESS(Status)) return Status;
 
     /* Now reference it */




More information about the Ros-diffs mailing list