[NTFS]
[reactos.git] / reactos / drivers / filesystems / ntfs / ntfs.c
index dff0505..613dcda 100644 (file)
@@ -51,18 +51,28 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
 {
     UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(DEVICE_NAME);
     NTSTATUS Status;
+    PDEVICE_OBJECT DeviceObject;
 
     TRACE_(NTFS, "DriverEntry(%p, '%wZ')\n", DriverObject, RegistryPath);
 
-    /* Initialize global data */
-    NtfsGlobalData = ExAllocatePoolWithTag(NonPagedPool, sizeof(NTFS_GLOBAL_DATA), 'GRDN');
-    if (!NtfsGlobalData)
+    Status = IoCreateDevice(DriverObject,
+                            sizeof(NTFS_GLOBAL_DATA),
+                            &DeviceName,
+                            FILE_DEVICE_DISK_FILE_SYSTEM,
+                            0,
+                            FALSE,
+                            &DeviceObject);
+    if (!NT_SUCCESS(Status))
     {
-        Status = STATUS_INSUFFICIENT_RESOURCES;
-        goto ErrorEnd;
+        WARN_(NTFS, "IoCreateDevice failed with status: %lx\n", Status);
+        return Status;
     }
 
+    /* Initialize global data */
+    NtfsGlobalData = DeviceObject->DeviceExtension;
     RtlZeroMemory(NtfsGlobalData, sizeof(NTFS_GLOBAL_DATA));
+
+    NtfsGlobalData->DeviceObject = DeviceObject;
     NtfsGlobalData->Identifier.Type = NTFS_TYPE_GLOBAL_DATA;
     NtfsGlobalData->Identifier.Size = sizeof(NTFS_GLOBAL_DATA);
 
@@ -80,38 +90,21 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
     NtfsGlobalData->CacheMgrCallbacks.AcquireForReadAhead = NtfsAcqReadAhead; 
     NtfsGlobalData->CacheMgrCallbacks.ReleaseFromReadAhead = NtfsRelReadAhead; 
 
+    NtfsGlobalData->FastIoDispatch.SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
+    NtfsGlobalData->FastIoDispatch.FastIoCheckIfPossible = NtfsFastIoCheckIfPossible;
+    NtfsGlobalData->FastIoDispatch.FastIoRead = NtfsFastIoRead;
+    NtfsGlobalData->FastIoDispatch.FastIoWrite = NtfsFastIoWrite;
+    DriverObject->FastIoDispatch = &NtfsGlobalData->FastIoDispatch;
+
     /* Driver can't be unloaded */
     DriverObject->DriverUnload = NULL;
 
-    Status = IoCreateDevice(DriverObject,
-                            sizeof(NTFS_GLOBAL_DATA),
-                            &DeviceName,
-                            FILE_DEVICE_DISK_FILE_SYSTEM,
-                            0,
-                            FALSE,
-                            &NtfsGlobalData->DeviceObject);
-    if (!NT_SUCCESS(Status))
-    {
-        WARN_(NTFS, "IoCreateDevice failed with status: %lx\n", Status);
-        goto ErrorEnd;
-    }
-
     NtfsGlobalData->DeviceObject->Flags |= DO_DIRECT_IO;
 
     /* Register file system */
     IoRegisterFileSystem(NtfsGlobalData->DeviceObject);
     ObReferenceObject(NtfsGlobalData->DeviceObject);
 
-ErrorEnd:
-    if (!NT_SUCCESS(Status))
-    {
-        if (NtfsGlobalData)
-        {
-            ExDeleteResourceLite(&NtfsGlobalData->Resource);
-            ExFreePoolWithTag(NtfsGlobalData, 'GRDN');
-        }
-    }
-
     return Status;
 }
 
@@ -135,6 +128,7 @@ NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject)
     DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION]   = NtfsFsdDispatch;
     DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL]        = NtfsFsdDirectoryControl;
     DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL]      = NtfsFsdFileSystemControl;
+    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]           = NtfsFsdDeviceControl;
 
     return;
 }