/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
- * FILE: drivers/fs/cdfs/cdfs.c
+ * FILE: drivers/filesystems/cdfs/cdfs.c
* PURPOSE: CDROM (ISO 9660) filesystem driver
* PROGRAMMER: Art Yerkes
* Eric Kohl
#define NDEBUG
#include <debug.h>
+#if defined(ALLOC_PRAGMA)
+#pragma alloc_text(INIT, DriverEntry)
+#endif
+
/* GLOBALS ******************************************************************/
PCDFS_GLOBAL_DATA CdfsGlobalData;
/* FUNCTIONS ****************************************************************/
+INIT_SECTION
NTSTATUS NTAPI
DriverEntry(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
* RETURNS: Success or failure
*/
{
- PDEVICE_OBJECT DeviceObject;
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);
Status = IoCreateDevice(DriverObject,
sizeof(CDFS_GLOBAL_DATA),
- &DeviceName,
+ &CdFsDeviceName,
FILE_DEVICE_CD_ROM_FILE_SYSTEM,
0,
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))
{
return(Status);
}
/* Initialize global data */
- CdfsGlobalData = DeviceObject->DeviceExtension;
+ CdfsGlobalData = CdFsDeviceObject->DeviceExtension;
RtlZeroMemory(CdfsGlobalData,
sizeof(CDFS_GLOBAL_DATA));
CdfsGlobalData->DriverObject = DriverObject;
- CdfsGlobalData->DeviceObject = DeviceObject;
+ CdfsGlobalData->CdFsDeviceObject = CdFsDeviceObject;
+ CdfsGlobalData->HddFsDeviceObject = HddFsDeviceObject;
+ HddFsDeviceObject->DeviceExtension = CdfsGlobalData;
/* Initialize driver data */
- DeviceObject->Flags = DO_DIRECT_IO;
- DriverObject->MajorFunction[IRP_MJ_CLOSE] = CdfsClose;
- DriverObject->MajorFunction[IRP_MJ_CLEANUP] = CdfsCleanup;
- DriverObject->MajorFunction[IRP_MJ_CREATE] = CdfsCreate;
- DriverObject->MajorFunction[IRP_MJ_READ] = CdfsRead;
- DriverObject->MajorFunction[IRP_MJ_WRITE] = CdfsWrite;
- DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =
- CdfsFileSystemControl;
- DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =
- CdfsDirectoryControl;
- DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] =
- CdfsQueryInformation;
- DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] =
- CdfsSetInformation;
- DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] =
- CdfsQueryVolumeInformation;
- DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] =
- CdfsSetVolumeInformation;
- DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
- CdfsDeviceControl;
+ DriverObject->MajorFunction[IRP_MJ_CLOSE] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_CLEANUP] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_CREATE] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_READ] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_WRITE] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = CdfsFsdDispatch;
+ DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL] = CdfsFsdDispatch;
+
+ CdfsGlobalData->FastIoDispatch.SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
+ CdfsGlobalData->FastIoDispatch.FastIoCheckIfPossible = CdfsFastIoCheckIfPossible;
+ CdfsGlobalData->FastIoDispatch.FastIoRead = CdfsFastIoRead;
+ CdfsGlobalData->FastIoDispatch.FastIoWrite = CdfsFastIoWrite;
+ DriverObject->FastIoDispatch = &CdfsGlobalData->FastIoDispatch;
+
+ /* Initialize lookaside list for IRP contexts */
+ ExInitializeNPagedLookasideList(&CdfsGlobalData->IrpContextLookasideList,
+ NULL, NULL, 0, sizeof(CDFS_IRP_CONTEXT), 'PRIC', 0);
DriverObject->DriverUnload = NULL;
CdfsGlobalData->CacheMgrCallbacks.AcquireForReadAhead = CdfsAcquireForLazyWrite;
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);
- DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
+ IoRegisterFileSystem(CdFsDeviceObject);
+ IoRegisterFileSystem(HddFsDeviceObject);
return(STATUS_SUCCESS);
}
-
-
-BOOLEAN NTAPI
-CdfsAcquireForLazyWrite(IN PVOID Context,
- IN BOOLEAN Wait)
-{
- PFCB Fcb = (PFCB)Context;
- ASSERT(Fcb);
- DPRINT("CdfsAcquireForLazyWrite(): Fcb %p\n", Fcb);
-
- if (!ExAcquireResourceExclusiveLite(&(Fcb->MainResource), Wait))
- {
- DPRINT("CdfsAcquireForLazyWrite(): ExReleaseResourceLite failed.\n");
- return FALSE;
- }
- return TRUE;
-}
-
-VOID NTAPI
-CdfsReleaseFromLazyWrite(IN PVOID Context)
-{
- PFCB Fcb = (PFCB)Context;
- ASSERT(Fcb);
- DPRINT("CdfsReleaseFromLazyWrite(): Fcb %p\n", Fcb);
-
- ExReleaseResourceLite(&(Fcb->MainResource));
-}