From a56a2e95a2f7d3ced5d210acbe3385aa145fb785 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Wed, 2 Jan 2019 20:28:21 +0100 Subject: [PATCH] [DISK.SYS] Add a HACK so that we can use NT5+ NTOS functions with this NT4 driver for removable devices. 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 | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/drivers/storage/class/disk/disk.c b/drivers/storage/class/disk/disk.c index cb845656914..b91e88e04de 100644 --- a/drivers/storage/class/disk/disk.c +++ b/drivers/storage/class/disk/disk.c @@ -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)) { -- 2.17.1