mirror of
https://github.com/reactos/reactos.git
synced 2024-08-11 13:48:01 +00:00
[CDFS]
Register CDFS as a disk filesystem too in order to flash our ISOs directly to USB drives and boot from them. Also fix some DPRINTs in the course of that. One step closer towards CORE-13184: This gets qemu -hda bootcd.iso to work. What still doesn't work is qemu -hda livecd.iso and booting from a flashed USB drive on real hardware. Further changes are also required in fs_rec, but this code isn't ready yet and doesn't seem to be the current blocker either. Credits go to the entire Hackfest Team for helping on this!! svn path=/trunk/; revision=75579
This commit is contained in:
parent
03d7bcb26c
commit
3c64b4cbe9
|
@ -55,9 +55,11 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
|
||||||
* RETURNS: Success or failure
|
* RETURNS: Success or failure
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
PDEVICE_OBJECT DeviceObject;
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Cdfs");
|
PDEVICE_OBJECT CdFsDeviceObject;
|
||||||
|
PDEVICE_OBJECT HddFsDeviceObject;
|
||||||
|
UNICODE_STRING CdFsDeviceName = RTL_CONSTANT_STRING(L"\\Cdfs");
|
||||||
|
UNICODE_STRING HddFsDeviceName = RTL_CONSTANT_STRING(L"\\CdfsHdd");
|
||||||
|
|
||||||
UNREFERENCED_PARAMETER(RegistryPath);
|
UNREFERENCED_PARAMETER(RegistryPath);
|
||||||
|
|
||||||
|
@ -65,25 +67,38 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
|
||||||
|
|
||||||
Status = IoCreateDevice(DriverObject,
|
Status = IoCreateDevice(DriverObject,
|
||||||
sizeof(CDFS_GLOBAL_DATA),
|
sizeof(CDFS_GLOBAL_DATA),
|
||||||
&DeviceName,
|
&CdFsDeviceName,
|
||||||
FILE_DEVICE_CD_ROM_FILE_SYSTEM,
|
FILE_DEVICE_CD_ROM_FILE_SYSTEM,
|
||||||
0,
|
0,
|
||||||
FALSE,
|
FALSE,
|
||||||
&DeviceObject);
|
&CdFsDeviceObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
return(Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = IoCreateDevice(DriverObject,
|
||||||
|
0,
|
||||||
|
&HddFsDeviceName,
|
||||||
|
FILE_DEVICE_DISK_FILE_SYSTEM,
|
||||||
|
0,
|
||||||
|
FALSE,
|
||||||
|
&HddFsDeviceObject);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize global data */
|
/* Initialize global data */
|
||||||
CdfsGlobalData = DeviceObject->DeviceExtension;
|
CdfsGlobalData = CdFsDeviceObject->DeviceExtension;
|
||||||
RtlZeroMemory(CdfsGlobalData,
|
RtlZeroMemory(CdfsGlobalData,
|
||||||
sizeof(CDFS_GLOBAL_DATA));
|
sizeof(CDFS_GLOBAL_DATA));
|
||||||
CdfsGlobalData->DriverObject = DriverObject;
|
CdfsGlobalData->DriverObject = DriverObject;
|
||||||
CdfsGlobalData->DeviceObject = DeviceObject;
|
CdfsGlobalData->CdFsDeviceObject = CdFsDeviceObject;
|
||||||
|
CdfsGlobalData->HddFsDeviceObject = HddFsDeviceObject;
|
||||||
|
HddFsDeviceObject->DeviceExtension = CdfsGlobalData;
|
||||||
|
|
||||||
/* Initialize driver data */
|
/* Initialize driver data */
|
||||||
DeviceObject->Flags = DO_DIRECT_IO;
|
|
||||||
DriverObject->MajorFunction[IRP_MJ_CLOSE] = CdfsFsdDispatch;
|
DriverObject->MajorFunction[IRP_MJ_CLOSE] = CdfsFsdDispatch;
|
||||||
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = CdfsFsdDispatch;
|
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = CdfsFsdDispatch;
|
||||||
DriverObject->MajorFunction[IRP_MJ_CREATE] = CdfsFsdDispatch;
|
DriverObject->MajorFunction[IRP_MJ_CREATE] = CdfsFsdDispatch;
|
||||||
|
@ -116,12 +131,11 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
|
||||||
CdfsGlobalData->CacheMgrCallbacks.AcquireForReadAhead = CdfsAcquireForLazyWrite;
|
CdfsGlobalData->CacheMgrCallbacks.AcquireForReadAhead = CdfsAcquireForLazyWrite;
|
||||||
CdfsGlobalData->CacheMgrCallbacks.ReleaseFromReadAhead = CdfsReleaseFromLazyWrite;
|
CdfsGlobalData->CacheMgrCallbacks.ReleaseFromReadAhead = CdfsReleaseFromLazyWrite;
|
||||||
|
|
||||||
DeviceObject->Flags |= DO_LOW_PRIORITY_FILESYSTEM;
|
CdFsDeviceObject->Flags |= DO_DIRECT_IO | DO_LOW_PRIORITY_FILESYSTEM;
|
||||||
|
HddFsDeviceObject->Flags |= DO_DIRECT_IO | DO_LOW_PRIORITY_FILESYSTEM;
|
||||||
|
|
||||||
IoRegisterFileSystem(DeviceObject);
|
IoRegisterFileSystem(CdFsDeviceObject);
|
||||||
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
|
IoRegisterFileSystem(HddFsDeviceObject);
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -248,7 +248,8 @@ typedef struct _CCB
|
||||||
typedef struct _CDFS_GLOBAL_DATA
|
typedef struct _CDFS_GLOBAL_DATA
|
||||||
{
|
{
|
||||||
PDRIVER_OBJECT DriverObject;
|
PDRIVER_OBJECT DriverObject;
|
||||||
PDEVICE_OBJECT DeviceObject;
|
PDEVICE_OBJECT CdFsDeviceObject;
|
||||||
|
PDEVICE_OBJECT HddFsDeviceObject;
|
||||||
ULONG Flags;
|
ULONG Flags;
|
||||||
CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
|
CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
|
||||||
FAST_IO_DISPATCH FastIoDispatch;
|
FAST_IO_DISPATCH FastIoDispatch;
|
||||||
|
|
|
@ -97,7 +97,7 @@ CdfsCleanup(
|
||||||
DeviceObject = IrpContext->DeviceObject;
|
DeviceObject = IrpContext->DeviceObject;
|
||||||
Stack = IrpContext->Stack;
|
Stack = IrpContext->Stack;
|
||||||
|
|
||||||
if (DeviceObject == CdfsGlobalData->DeviceObject)
|
if (DeviceObject == CdfsGlobalData->CdFsDeviceObject || DeviceObject == CdfsGlobalData->HddFsDeviceObject)
|
||||||
{
|
{
|
||||||
DPRINT("Closing file system\n");
|
DPRINT("Closing file system\n");
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
|
|
|
@ -94,7 +94,7 @@ CdfsClose(
|
||||||
DeviceObject = IrpContext->DeviceObject;
|
DeviceObject = IrpContext->DeviceObject;
|
||||||
Stack = IrpContext->Stack;
|
Stack = IrpContext->Stack;
|
||||||
|
|
||||||
if (DeviceObject == CdfsGlobalData->DeviceObject)
|
if (DeviceObject == CdfsGlobalData->CdFsDeviceObject || DeviceObject == CdfsGlobalData->HddFsDeviceObject)
|
||||||
{
|
{
|
||||||
DPRINT("Closing file system\n");
|
DPRINT("Closing file system\n");
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
|
|
|
@ -266,7 +266,7 @@ CdfsCreate(
|
||||||
ASSERT(IrpContext);
|
ASSERT(IrpContext);
|
||||||
|
|
||||||
DeviceObject = IrpContext->DeviceObject;
|
DeviceObject = IrpContext->DeviceObject;
|
||||||
if (DeviceObject == CdfsGlobalData->DeviceObject)
|
if (DeviceObject == CdfsGlobalData->CdFsDeviceObject || DeviceObject == CdfsGlobalData->HddFsDeviceObject)
|
||||||
{
|
{
|
||||||
/* DeviceObject represents FileSystem instead of logical volume */
|
/* DeviceObject represents FileSystem instead of logical volume */
|
||||||
DPRINT("Opening file system\n");
|
DPRINT("Opening file system\n");
|
||||||
|
|
|
@ -63,7 +63,7 @@ CdfsLockControl(
|
||||||
|
|
||||||
DPRINT("CdfsLockControl(IrpContext %p)\n", IrpContext);
|
DPRINT("CdfsLockControl(IrpContext %p)\n", IrpContext);
|
||||||
|
|
||||||
if (IrpContext->DeviceObject == CdfsGlobalData->DeviceObject)
|
if (IrpContext->DeviceObject == CdfsGlobalData->CdFsDeviceObject || IrpContext->DeviceObject == CdfsGlobalData->HddFsDeviceObject)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,9 +138,9 @@ CdfsGrabFCB(PDEVICE_EXTENSION Vcb,
|
||||||
{
|
{
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
|
|
||||||
DPRINT("grabbing FCB at %p: %S, refCount:%d\n",
|
DPRINT("grabbing FCB at %p: %wZ, refCount:%d\n",
|
||||||
Fcb,
|
Fcb,
|
||||||
Fcb->PathName,
|
&Fcb->PathName,
|
||||||
Fcb->RefCount);
|
Fcb->RefCount);
|
||||||
|
|
||||||
KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
|
KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
|
||||||
|
@ -208,7 +208,8 @@ CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
|
||||||
{
|
{
|
||||||
Fcb = CONTAINING_RECORD(current_entry, FCB, FcbListEntry);
|
Fcb = CONTAINING_RECORD(current_entry, FCB, FcbListEntry);
|
||||||
|
|
||||||
DPRINT("Comparing '%wZ' and '%wZ'\n", FileName, &Fcb->PathName);
|
// Disabled the DPRINT! Can't be called at DISPATCH_LEVEL!
|
||||||
|
//DPRINT("Comparing '%wZ' and '%wZ'\n", FileName, &Fcb->PathName);
|
||||||
if (RtlCompareUnicodeString(FileName, &Fcb->PathName, TRUE) == 0)
|
if (RtlCompareUnicodeString(FileName, &Fcb->PathName, TRUE) == 0)
|
||||||
{
|
{
|
||||||
Fcb->RefCount++;
|
Fcb->RefCount++;
|
||||||
|
|
|
@ -222,26 +222,29 @@ CdfsGetVolumeData(
|
||||||
&Toc,
|
&Toc,
|
||||||
&Size,
|
&Size,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
ExFreePoolWithTag(Buffer, CDFS_TAG);
|
|
||||||
return Status;
|
DPRINT("FirstTrack %u, LastTrack %u, TrackNumber %u\n",
|
||||||
|
Toc.FirstTrack, Toc.LastTrack, Toc.TrackData[0].TrackNumber);
|
||||||
|
|
||||||
|
Offset = Toc.TrackData[0].Address[1] * 60 * 75;
|
||||||
|
Offset += Toc.TrackData[0].Address[2] * 75;
|
||||||
|
Offset += Toc.TrackData[0].Address[3];
|
||||||
|
if (Offset >= 150)
|
||||||
|
{
|
||||||
|
/* Remove MSF numbering offset of first frame */
|
||||||
|
/* FIXME: should be done only for real cdroms? */
|
||||||
|
Offset -= 150;
|
||||||
|
}
|
||||||
|
CdInfo->VolumeOffset = Offset;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
DPRINT("FirstTrack %u, LastTrack %u, TrackNumber %u\n",
|
|
||||||
Toc.FirstTrack, Toc.LastTrack, Toc.TrackData[0].TrackNumber);
|
|
||||||
|
|
||||||
Offset = Toc.TrackData[0].Address[1] * 60 * 75;
|
|
||||||
Offset += Toc.TrackData[0].Address[2] * 75;
|
|
||||||
Offset += Toc.TrackData[0].Address[3];
|
|
||||||
if (Offset >= 150)
|
|
||||||
{
|
{
|
||||||
/* Remove MSF numbering offset of first frame */
|
DPRINT1("Allowing mount of CDFS volume on non-CD device\n");
|
||||||
/* FIXME: should be done only for real cdroms? */
|
CdInfo->VolumeOffset = 0;
|
||||||
Offset -= 150;
|
|
||||||
}
|
}
|
||||||
CdInfo->VolumeOffset = Offset;
|
|
||||||
|
|
||||||
DPRINT("Offset of first track in last session %u\n", Offset);
|
DPRINT("Offset of first track in last session %u\n", Offset);
|
||||||
|
|
||||||
CdInfo->JolietLevel = 0;
|
CdInfo->JolietLevel = 0;
|
||||||
|
@ -325,10 +328,19 @@ CdfsMountVolume(
|
||||||
PVPB Vpb;
|
PVPB Vpb;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
CDINFO CdInfo;
|
CDINFO CdInfo;
|
||||||
|
DEVICE_TYPE FilesystemDeviceType;
|
||||||
|
|
||||||
DPRINT("CdfsMountVolume() called\n");
|
DPRINT("CdfsMountVolume() called\n");
|
||||||
|
|
||||||
if (DeviceObject != CdfsGlobalData->DeviceObject)
|
if (DeviceObject == CdfsGlobalData->CdFsDeviceObject)
|
||||||
|
{
|
||||||
|
FilesystemDeviceType = FILE_DEVICE_CD_ROM_FILE_SYSTEM;
|
||||||
|
}
|
||||||
|
else if (DeviceObject == CdfsGlobalData->HddFsDeviceObject)
|
||||||
|
{
|
||||||
|
FilesystemDeviceType = FILE_DEVICE_DISK_FILE_SYSTEM;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||||
goto ByeBye;
|
goto ByeBye;
|
||||||
|
@ -347,7 +359,7 @@ CdfsMountVolume(
|
||||||
Status = IoCreateDevice(CdfsGlobalData->DriverObject,
|
Status = IoCreateDevice(CdfsGlobalData->DriverObject,
|
||||||
sizeof(DEVICE_EXTENSION),
|
sizeof(DEVICE_EXTENSION),
|
||||||
NULL,
|
NULL,
|
||||||
FILE_DEVICE_CD_ROM_FILE_SYSTEM,
|
FilesystemDeviceType,
|
||||||
DeviceToMount->Characteristics,
|
DeviceToMount->Characteristics,
|
||||||
FALSE,
|
FALSE,
|
||||||
&NewDeviceObject);
|
&NewDeviceObject);
|
||||||
|
|
Loading…
Reference in a new issue