https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6c733856258ebfac4b62ff...
commit 6c733856258ebfac4b62ffb7733202dddb74a4be Author: Pierre Schweitzer pierre@reactos.org 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;