[CDFS]
[reactos.git] / reactos / drivers / filesystems / cdfs / cdfs.c
index 9faa5a1..aa51948 100644 (file)
@@ -19,7 +19,7 @@
 /*
  * 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;
@@ -39,6 +43,7 @@ PCDFS_GLOBAL_DATA CdfsGlobalData;
 
 /* FUNCTIONS ****************************************************************/
 
+INIT_SECTION
 NTSTATUS NTAPI
 DriverEntry(PDRIVER_OBJECT DriverObject,
             PUNICODE_STRING RegistryPath)
@@ -50,9 +55,11 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
             * 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);
 
@@ -60,49 +67,62 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
 
     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;
 
     /* Cache manager */
@@ -111,83 +131,11 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
     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));
-}
-
-BOOLEAN
-NTAPI
-CdfsFastIoRead(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ ULONG Length,
-    _In_ BOOLEAN Wait,
-    _In_ ULONG LockKey,
-    _Out_ PVOID Buffer,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject)
-{
-    DBG_UNREFERENCED_PARAMETER(FileObject);
-    DBG_UNREFERENCED_PARAMETER(FileOffset);
-    DBG_UNREFERENCED_PARAMETER(Length);
-    DBG_UNREFERENCED_PARAMETER(Wait);
-    DBG_UNREFERENCED_PARAMETER(LockKey);
-    DBG_UNREFERENCED_PARAMETER(Buffer);
-    DBG_UNREFERENCED_PARAMETER(IoStatus);
-    DBG_UNREFERENCED_PARAMETER(DeviceObject);
-    return FALSE;
-}
-
-BOOLEAN
-NTAPI
-CdfsFastIoWrite(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ ULONG Length,
-    _In_ BOOLEAN Wait,
-    _In_ ULONG LockKey,
-    _In_ PVOID Buffer,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject)
-{
-    DBG_UNREFERENCED_PARAMETER(FileObject);
-    DBG_UNREFERENCED_PARAMETER(FileOffset);
-    DBG_UNREFERENCED_PARAMETER(Length);
-    DBG_UNREFERENCED_PARAMETER(Wait);
-    DBG_UNREFERENCED_PARAMETER(LockKey);
-    DBG_UNREFERENCED_PARAMETER(Buffer);
-    DBG_UNREFERENCED_PARAMETER(IoStatus);
-    DBG_UNREFERENCED_PARAMETER(DeviceObject);
-    return FALSE;
-}