https://git.reactos.org/?p=reactos.git;a=commitdiff;h=779d87b48366a6941c394ef9dc1b19d4e2535d21

commit 779d87b48366a6941c394ef9dc1b19d4e2535d21
Author:     Pierre Schweitzer <pie...@reactos.org>
AuthorDate: Fri Oct 5 10:45:21 2018 +0200
Commit:     Pierre Schweitzer <pie...@reactos.org>
CommitDate: Fri Oct 5 10:49:59 2018 +0200

    [NTOSKRNL] Implement IopCheckTopDeviceHint()
---
 ntoskrnl/include/internal/io.h |  7 ++++++
 ntoskrnl/io/iomgr/file.c       | 48 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+)

diff --git a/ntoskrnl/include/internal/io.h b/ntoskrnl/include/internal/io.h
index 8f0398b4ad..18a9b2de50 100644
--- a/ntoskrnl/include/internal/io.h
+++ b/ntoskrnl/include/internal/io.h
@@ -1299,6 +1299,13 @@ IopGetFileInformation(
     OUT PULONG ReturnedLength
 );
 
+BOOLEAN
+NTAPI
+IopVerifyDeviceObjectOnStack(
+    IN PDEVICE_OBJECT BaseDeviceObject,
+    IN PDEVICE_OBJECT TopDeviceObjectHint
+);
+
 //
 // I/O Timer Routines
 //
diff --git a/ntoskrnl/io/iomgr/file.c b/ntoskrnl/io/iomgr/file.c
index a8da317317..c14e61806b 100644
--- a/ntoskrnl/io/iomgr/file.c
+++ b/ntoskrnl/io/iomgr/file.c
@@ -266,6 +266,54 @@ IopDoNameTransmogrify(IN PIRP Irp,
     ExFreePool(DataBuffer);
 }
 
+NTSTATUS
+IopCheckTopDeviceHint(IN OUT PDEVICE_OBJECT * DeviceObject,
+                      IN POPEN_PACKET OpenPacket,
+                      BOOLEAN DirectOpen)
+{
+    PDEVICE_OBJECT LocalDevice;
+    DEVICE_TYPE DeviceType;
+
+    LocalDevice = *DeviceObject;
+
+    /* Direct open is not allowed */
+    if (DirectOpen)
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Validate we have a file system device */
+    DeviceType = LocalDevice->DeviceType;
+    if (DeviceType != FILE_DEVICE_DISK_FILE_SYSTEM &&
+        DeviceType != FILE_DEVICE_CD_ROM_FILE_SYSTEM &&
+        DeviceType != FILE_DEVICE_TAPE_FILE_SYSTEM &&
+        DeviceType != FILE_DEVICE_NETWORK_FILE_SYSTEM &&
+        DeviceType != FILE_DEVICE_DFS_FILE_SYSTEM)
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Verify the hint and if it's OK, return it */
+    if (IopVerifyDeviceObjectOnStack(LocalDevice, 
OpenPacket->TopDeviceObjectHint))
+    {
+        *DeviceObject = OpenPacket->TopDeviceObjectHint;
+        return STATUS_SUCCESS;
+    }
+
+    /* Failure case here */
+    /* If we thought was had come through a mount point,
+     * actually update we didn't and return the error
+     */
+    if (OpenPacket->TraversedMountPoint)
+    {
+        OpenPacket->TraversedMountPoint = FALSE;
+        return STATUS_MOUNT_POINT_NOT_RESOLVED;
+    }
+
+    /* Otherwise, just return the fact the hint is invalid */
+    return STATUS_INVALID_DEVICE_OBJECT_PARAMETER;
+}
+
 NTSTATUS
 NTAPI
 IopParseDevice(IN PVOID ParseObject,

Reply via email to