[DISK.SYS] Add a HACK so that we can use NT5+ NTOS functions with this NT4 driver...
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Wed, 2 Jan 2019 19:28:21 +0000 (20:28 +0100)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 10 Feb 2019 21:39:12 +0000 (22:39 +0100)
This is needed in order to avoid an infinite recursive loop between
disk!UpdateRemovableGeometry() and ntos!IoReadPartitionTable().
This does not happen with NT5+ disk_new.sys because it doesn't call
IoReadPartitionTable() in that situation.

drivers/storage/class/disk/disk.c

index cb84565..b91e88e 100644 (file)
@@ -116,6 +116,15 @@ typedef struct _DISK_DATA {
 
     PARTITION_LIST_STATE PartitionListState;
 
+#ifdef __REACTOS__
+    //
+    // HACK so that we can use NT5+ NTOS functions with this NT4 driver
+    // for removable devices and avoid an infinite recursive loop between
+    // disk!UpdateRemovableGeometry() and ntos!IoReadPartitionTable().
+    //
+    ULONG UpdateRemovableGeometryCount;
+#endif
+
 } DISK_DATA, *PDISK_DATA;
 
 //
@@ -1147,6 +1156,15 @@ CreatePartitionDeviceObjects(
 
     }
 
+#ifdef __REACTOS__
+    //
+    // HACK so that we can use NT5+ NTOS functions with this NT4 driver
+    // for removable devices and avoid an infinite recursive loop between
+    // disk!UpdateRemovableGeometry() and ntos!IoReadPartitionTable().
+    //
+    diskData->UpdateRemovableGeometryCount = 0;
+#endif
+
     //
     // Create objects for all the partitions on the device.
     //
@@ -4456,6 +4474,21 @@ Return Value:
         return(status);
     }
 
+#ifdef __REACTOS__
+    //
+    // HACK so that we can use NT5+ NTOS functions with this NT4 driver
+    // for removable devices and avoid an infinite recursive loop between
+    // disk!UpdateRemovableGeometry() and ntos!IoReadPartitionTable().
+    //
+    // Check whether the update-count is greater or equal than one
+    // (and increase it) and if so, reset it and return success.
+    if (diskData->UpdateRemovableGeometryCount++ >= 1)
+    {
+        diskData->UpdateRemovableGeometryCount = 0;
+        return(STATUS_SUCCESS);
+    }
+#endif
+
     //
     // Read the partition table again.
     //
@@ -4465,6 +4498,15 @@ Return Value:
                       TRUE,
                       &partitionList);
 
+#ifdef __REACTOS__
+    //
+    // HACK so that we can use NT5+ NTOS functions with this NT4 driver
+    // for removable devices and avoid an infinite recursive loop between
+    // disk!UpdateRemovableGeometry() and ntos!IoReadPartitionTable().
+    //
+    // Inconditionally reset the update-count.
+    diskData->UpdateRemovableGeometryCount = 0;
+#endif
 
     if (!NT_SUCCESS(status)) {