https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6c733856258ebfac4b62ffb7733202dddb74a4be

commit 6c733856258ebfac4b62ffb7733202dddb74a4be
Author: Pierre Schweitzer <[email protected]>
AuthorDate: Sun Nov 12 18:36:20 2017 +0100

    [CDFS_NEW]
    Restore the ability to restore installing from disk image.
    CORE-13184
---
 drivers/filesystems/cdfs_new/cdinit.c   | 58 +++++++++++++++++++++++++++++++++
 drivers/filesystems/cdfs_new/cdstruc.h  |  4 +++
 drivers/filesystems/cdfs_new/fsctrl.c   | 44 +++++++++++++++++++++++++
 drivers/filesystems/cdfs_new/strucsup.c | 10 ++++++
 4 files changed, 116 insertions(+)

diff --git a/drivers/filesystems/cdfs_new/cdinit.c 
b/drivers/filesystems/cdfs_new/cdinit.c
index e66bd75377..aac879a235 100755
--- a/drivers/filesystems/cdfs_new/cdinit.c
+++ b/drivers/filesystems/cdfs_new/cdinit.c
@@ -38,6 +38,10 @@ NTSTATUS
 CdInitializeGlobalData (
     IN PDRIVER_OBJECT DriverObject,
     IN PDEVICE_OBJECT FileSystemDeviceObject
+#ifdef __REACTOS__
+    ,
+    IN PDEVICE_OBJECT HddFileSystemDeviceObject
+#endif
     );
 
 NTSTATUS
@@ -89,6 +93,9 @@ Return Value:
     NTSTATUS Status;
     UNICODE_STRING UnicodeString;
     PDEVICE_OBJECT CdfsFileSystemDeviceObject;
+#ifdef __REACTOS__
+    PDEVICE_OBJECT HddFileSystemDeviceObject;
+#endif
 
     //
     // Create the device object.
@@ -107,6 +114,27 @@ Return Value:
     if (!NT_SUCCESS( Status )) {
         return Status;
     }
+
+#ifdef __REACTOS__
+    //
+    // Create the HDD device object.
+    //
+
+    RtlInitUnicodeString( &UnicodeString, L"\\CdfsHdd" );
+
+    Status = IoCreateDevice( DriverObject,
+                             0,
+                             &UnicodeString,
+                             FILE_DEVICE_DISK_FILE_SYSTEM,
+                             0,
+                             FALSE,
+                             &HddFileSystemDeviceObject );
+
+    if (!NT_SUCCESS( Status )) {
+        IoDeleteDevice (CdfsFileSystemDeviceObject);
+        return Status;
+    }
+#endif
     DriverObject->DriverUnload = CdUnload;
     //
     //  Note that because of the way data caching is done, we set neither
@@ -141,6 +169,9 @@ Return Value:
     Status = IoRegisterShutdownNotification (CdfsFileSystemDeviceObject);
     if (!NT_SUCCESS (Status)) {
         IoDeleteDevice (CdfsFileSystemDeviceObject);
+#ifdef __REACTOS__
+        IoDeleteDevice (HddFileSystemDeviceObject);
+#endif
         return Status;
     }
 
@@ -148,9 +179,16 @@ Return Value:
     //  Initialize the global data structures
     //
 
+#ifndef __REACTOS__
     Status = CdInitializeGlobalData( DriverObject, CdfsFileSystemDeviceObject 
);
+#else
+    Status = CdInitializeGlobalData( DriverObject, CdfsFileSystemDeviceObject, 
HddFileSystemDeviceObject );
+#endif
     if (!NT_SUCCESS (Status)) {
         IoDeleteDevice (CdfsFileSystemDeviceObject);
+#ifdef __REACTOS__
+        IoDeleteDevice (HddFileSystemDeviceObject);
+#endif
         return Status;
     }
 
@@ -161,9 +199,16 @@ Return Value:
     //
 
     CdfsFileSystemDeviceObject->Flags |= DO_LOW_PRIORITY_FILESYSTEM;
+#ifdef __REACTOS__
+    HddFileSystemDeviceObject->Flags |= DO_LOW_PRIORITY_FILESYSTEM;
+#endif
 
     IoRegisterFileSystem( CdfsFileSystemDeviceObject );
     ObReferenceObject (CdfsFileSystemDeviceObject);
+#ifdef __REACTOS__
+    IoRegisterFileSystem( HddFileSystemDeviceObject );
+    ObReferenceObject (HddFileSystemDeviceObject);
+#endif
 
     //
     //  And return to our caller
@@ -198,6 +243,9 @@ Return Value:
 {
     IoUnregisterFileSystem (DeviceObject);
     IoDeleteDevice (CdData.FileSystemDeviceObject);
+#ifdef __REACTOS__
+    IoDeleteDevice (CdData.HddFileSystemDeviceObject);
+#endif
 
     CdCompleteRequest( NULL, Irp, STATUS_SUCCESS );
     return STATUS_SUCCESS;
@@ -241,6 +289,9 @@ Return Value:
     IoFreeWorkItem (CdData.CloseItem);
     ExDeleteResourceLite( &CdData.DataResource );
     ObDereferenceObject (CdData.FileSystemDeviceObject);
+#ifdef __REACTOS__
+    ObDereferenceObject (CdData.HddFileSystemDeviceObject);
+#endif
 }
 
 //
@@ -251,6 +302,10 @@ NTSTATUS
 CdInitializeGlobalData (
     IN PDRIVER_OBJECT DriverObject,
     IN PDEVICE_OBJECT FileSystemDeviceObject
+#ifdef __REACTOS__
+    ,
+    IN PDEVICE_OBJECT HddFileSystemDeviceObject
+#endif
     )
 
 /*++
@@ -307,6 +362,9 @@ Return Value:
 
     CdData.DriverObject = DriverObject;
     CdData.FileSystemDeviceObject = FileSystemDeviceObject;
+#ifdef __REACTOS__
+    CdData.HddFileSystemDeviceObject = HddFileSystemDeviceObject;
+#endif
 
     InitializeListHead( &CdData.VcbQueue );
 
diff --git a/drivers/filesystems/cdfs_new/cdstruc.h 
b/drivers/filesystems/cdfs_new/cdstruc.h
index e120ee27d0..1259349db2 100755
--- a/drivers/filesystems/cdfs_new/cdstruc.h
+++ b/drivers/filesystems/cdfs_new/cdstruc.h
@@ -349,6 +349,10 @@ typedef struct _CD_DATA {
 
     PDEVICE_OBJECT FileSystemDeviceObject;
 
+#ifdef __REACTOS__
+    PDEVICE_OBJECT HddFileSystemDeviceObject;
+#endif
+
     //
     //  Following are used to manage the async and delayed close queue.
     //
diff --git a/drivers/filesystems/cdfs_new/fsctrl.c 
b/drivers/filesystems/cdfs_new/fsctrl.c
index 31c4965f9f..74b6c63839 100755
--- a/drivers/filesystems/cdfs_new/fsctrl.c
+++ b/drivers/filesystems/cdfs_new/fsctrl.c
@@ -596,6 +596,10 @@ Return Value:
     ULONG TocDiskFlags = 0;
     ULONG MediaChangeCount = 0;
 
+#ifdef __REACTOS__
+    DEVICE_TYPE FilesystemDeviceType;
+#endif
+
     PAGED_CODE();
 
     //
@@ -603,7 +607,16 @@ Return Value:
     //  always be waitable.
     //
 
+#ifdef __REACTOS__
+    if (IrpSp->DeviceObject == CdData.HddFileSystemDeviceObject) {
+        FilesystemDeviceType = FILE_DEVICE_DISK_FILE_SYSTEM;
+    } else {
+#endif
     ASSERT( Vpb->RealDevice->DeviceType == FILE_DEVICE_CD_ROM );
+#ifdef __REACTOS__
+        FilesystemDeviceType = FILE_DEVICE_CD_ROM_FILE_SYSTEM;
+    }
+#endif
     ASSERT( FlagOn( IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT ));
 
     //
@@ -630,7 +643,11 @@ Return Value:
     //
 
     Status = CdPerformDevIoCtrl( IrpContext,
+#ifndef __REACTOS__
                                  IOCTL_CDROM_CHECK_VERIFY,
+#else
+                                 (FilesystemDeviceType == 
FILE_DEVICE_DISK_FILE_SYSTEM ? IOCTL_DISK_CHECK_VERIFY : 
IOCTL_CDROM_CHECK_VERIFY),
+#endif
                                  DeviceObjectWeTalkTo,
                                  &MediaChangeCount,
                                  sizeof(ULONG),
@@ -659,7 +676,11 @@ Return Value:
     //
 
     Status = CdPerformDevIoCtrl( IrpContext,
+#ifndef __REACTOS__
                                  IOCTL_CDROM_GET_DRIVE_GEOMETRY,
+#else
+                                 (FilesystemDeviceType == 
FILE_DEVICE_DISK_FILE_SYSTEM ? IOCTL_DISK_GET_DRIVE_GEOMETRY : 
IOCTL_CDROM_GET_DRIVE_GEOMETRY),
+#endif
                                  DeviceObjectWeTalkTo,
                                  &DiskGeometry,
                                  sizeof( DISK_GEOMETRY ),
@@ -727,7 +748,11 @@ Return Value:
         Status = IoCreateDevice( CdData.DriverObject,
                                  sizeof( VOLUME_DEVICE_OBJECT ) - sizeof( 
DEVICE_OBJECT ),
                                  NULL,
+#ifndef __REACTOS__
                                  FILE_DEVICE_CD_ROM_FILE_SYSTEM,
+#else
+                                 FilesystemDeviceType,
+#endif
                                  0,
                                  FALSE,
                                  (PDEVICE_OBJECT *) &VolDo );
@@ -780,7 +805,21 @@ Return Value:
 
         if (Status != STATUS_SUCCESS)  { 
 
+#ifdef __REACTOS__
+
+            //
+            // Don't bail out if that was a disk based ISO image, it is legit
+            //
+
+            if (FilesystemDeviceType == FILE_DEVICE_DISK_FILE_SYSTEM) {
+                CdFreePool( &CdromToc );
+                Status = STATUS_SUCCESS;
+            } else {
+#endif
             try_leave( Status ); 
+#ifdef __REACTOS__
+            }
+#endif
         }
 
         //
@@ -2247,7 +2286,12 @@ Return Value:
     //  We only allow the invalidate call to come in on our file system 
devices.
     //
     
+#ifndef __REACTOS__
     if (IrpSp->DeviceObject != CdData.FileSystemDeviceObject)  {
+#else
+    if (IrpSp->DeviceObject != CdData.FileSystemDeviceObject &&
+        IrpSp->DeviceObject != CdData.HddFileSystemDeviceObject)  {
+#endif
 
         CdCompleteRequest( IrpContext, Irp, STATUS_INVALID_DEVICE_REQUEST );
 
diff --git a/drivers/filesystems/cdfs_new/strucsup.c 
b/drivers/filesystems/cdfs_new/strucsup.c
index 58210ad7a1..3439b73000 100755
--- a/drivers/filesystems/cdfs_new/strucsup.c
+++ b/drivers/filesystems/cdfs_new/strucsup.c
@@ -1570,7 +1570,12 @@ Return Value:
     //  occur in the context of fileobjects (i.e., mount).
     //
 
+#ifndef __REACTOS__
     if (IrpSp->DeviceObject == CdData.FileSystemDeviceObject) {
+#else
+    if (IrpSp->DeviceObject == CdData.FileSystemDeviceObject ||
+        IrpSp->DeviceObject == CdData.HddFileSystemDeviceObject) {
+#endif
 
         if (IrpSp->FileObject != NULL &&
             IrpSp->MajorFunction != IRP_MJ_CREATE &&
@@ -1648,7 +1653,12 @@ Return Value:
     //  the Vcb field.
     //
 
+#ifndef __REACTOS__
     if (IrpSp->DeviceObject != CdData.FileSystemDeviceObject) {
+#else
+    if (IrpSp->DeviceObject != CdData.FileSystemDeviceObject &&
+        IrpSp->DeviceObject != CdData.HddFileSystemDeviceObject) {
+#endif
 
         NewIrpContext->Vcb =  &((PVOLUME_DEVICE_OBJECT) 
IrpSp->DeviceObject)->Vcb;
     

Reply via email to