From 8d54c16b65777f2348eb9e73f2f7c45b092794e3 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 12 Jan 2008 20:54:41 +0000 Subject: [PATCH] =?UTF-8?q?Rewritten=20NTFS=20driver=20entry=20:=20-=20Use?= =?UTF-8?q?=20Herv=C3=A9=20debug=20method=20(better),=20thanks=20to=20Herv?= =?UTF-8?q?=C3=A9=20-=20Use=20NTAPI=20instead=20of=20STDCALL=20to=20have?= =?UTF-8?q?=20MSVC=20compatibility,=20thanks=20to=20Herv=C3=A9=20-=20Moved?= =?UTF-8?q?=20IRP=20functions=20array=20to=20a=20new=20function,=20NtfsIni?= =?UTF-8?q?tializeFunctionPointers=20-=20Added=20more=20checks=20-=20Initi?= =?UTF-8?q?alize=20global=20and=20local=20data=20before=20acting=20with=20?= =?UTF-8?q?kernel=20-=20Removeed=20the=20use=20of=20one=20var=20That=20sho?= =?UTF-8?q?uld=20be=20all....?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=31747 --- reactos/drivers/filesystems/ntfs/ntfs.c | 112 +++++++++++++++--------- reactos/drivers/filesystems/ntfs/ntfs.h | 18 +++- 2 files changed, 86 insertions(+), 44 deletions(-) diff --git a/reactos/drivers/filesystems/ntfs/ntfs.c b/reactos/drivers/filesystems/ntfs/ntfs.c index 67a11f8bdb5..4589687fe99 100644 --- a/reactos/drivers/filesystems/ntfs/ntfs.c +++ b/reactos/drivers/filesystems/ntfs/ntfs.c @@ -23,6 +23,7 @@ * FILE: services/fs/ntfs/ntfs.c * PURPOSE: NTFS filesystem driver * PROGRAMMER: Eric Kohl + * Pierre Schweitzer */ /* INCLUDES *****************************************************************/ @@ -34,12 +35,12 @@ /* GLOBALS *****************************************************************/ -PNTFS_GLOBAL_DATA NtfsGlobalData; +PNTFS_GLOBAL_DATA NtfsGlobalData = NULL; /* FUNCTIONS ****************************************************************/ -NTSTATUS STDCALL +NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) /* @@ -50,52 +51,83 @@ DriverEntry(PDRIVER_OBJECT DriverObject, * RETURNS: Success or failure */ { - PDEVICE_OBJECT DeviceObject; NTSTATUS Status; - UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Ntfs"); + UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(DEVICE_NAME); - DPRINT("NTFS 0.0.1\n"); - - Status = IoCreateDevice(DriverObject, - sizeof(NTFS_GLOBAL_DATA), - &DeviceName, - FILE_DEVICE_DISK_FILE_SYSTEM, - 0, - FALSE, - &DeviceObject); - if (!NT_SUCCESS(Status)) - { - return(Status); - } + TRACE_(NTFS, "DriverEntry(%p, '%wZ')\n", DriverObject, RegistryPath); /* Initialize global data */ - NtfsGlobalData = DeviceObject->DeviceExtension; - RtlZeroMemory(NtfsGlobalData, - sizeof(NTFS_GLOBAL_DATA)); + NtfsGlobalData = ExAllocatePoolWithTag(NonPagedPool, sizeof(NTFS_GLOBAL_DATA), TAG('N', 'D', 'R', 'G')); + if (!NtfsGlobalData) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto ErrorEnd; + } + RtlZeroMemory(NtfsGlobalData, sizeof(NTFS_GLOBAL_DATA)); + NtfsGlobalData->Identifier.Type = NTFS_TYPE_GLOBAL_DATA; + NtfsGlobalData->Identifier.Size = sizeof(NTFS_GLOBAL_DATA); + + ExInitializeResourceLite(&NtfsGlobalData->Resource); + + /* Keep trace of Driver Object */ NtfsGlobalData->DriverObject = DriverObject; - NtfsGlobalData->DeviceObject = DeviceObject; - - /* Initialize driver data */ - DeviceObject->Flags |= DO_DIRECT_IO; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = NtfsClose; - DriverObject->MajorFunction[IRP_MJ_CREATE] = NtfsCreate; - DriverObject->MajorFunction[IRP_MJ_READ] = NtfsRead; - DriverObject->MajorFunction[IRP_MJ_WRITE] = NtfsWrite; - DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = - NtfsFileSystemControl; - DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = - NtfsDirectoryControl; - DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = - NtfsQueryInformation; - DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = - NtfsQueryVolumeInformation; - DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] = - NtfsSetVolumeInformation; + /* Initialize IRP functions array */ + NtfsInitializeFunctionPointers(DriverObject); + /* Driver can't be unloaded */ DriverObject->DriverUnload = NULL; - IoRegisterFileSystem(DeviceObject); + 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; + } - return(STATUS_SUCCESS); + /* Register file system */ + IoRegisterFileSystem(NtfsGlobalData->DeviceObject); + ObReferenceObject(NtfsGlobalData->DeviceObject); + +ErrorEnd: + + if (!NT_SUCCESS(Status)) + { + if (NtfsGlobalData) + { + ExDeleteResourceLite(&NtfsGlobalData->Resource); + ExFreePoolWithTag(NtfsGlobalData, TAG('N', 'D', 'R', 'G')); + } + } + + + return Status; +} + +VOID NTAPI +NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject) +/* + * FUNCTION: Called within the driver entry to initialize the IRP functions array + * ARGUMENTS: + * DriverObject = object describing this driver + * RETURNS: Nothing + */ +{ + DriverObject->MajorFunction[IRP_MJ_CLOSE] = NtfsClose; + DriverObject->MajorFunction[IRP_MJ_CREATE] = NtfsCreate; + DriverObject->MajorFunction[IRP_MJ_READ] = NtfsRead; + DriverObject->MajorFunction[IRP_MJ_WRITE] = NtfsWrite; + DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = NtfsFileSystemControl; + DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = NtfsDirectoryControl; + DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = NtfsQueryInformation; + DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = NtfsQueryVolumeInformation; + DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] = NtfsSetVolumeInformation; + + return; } diff --git a/reactos/drivers/filesystems/ntfs/ntfs.h b/reactos/drivers/filesystems/ntfs/ntfs.h index 7dde6af7bc9..43001a0520f 100644 --- a/reactos/drivers/filesystems/ntfs/ntfs.h +++ b/reactos/drivers/filesystems/ntfs/ntfs.h @@ -8,7 +8,6 @@ #define USE_ROS_CC_AND_FS - #define CACHEPAGESIZE(pDeviceExt) \ ((pDeviceExt)->NtfsInfo.UCHARsPerCluster > PAGE_SIZE ? \ (pDeviceExt)->NtfsInfo.UCHARsPerCluster : PAGE_SIZE) @@ -19,6 +18,8 @@ #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) +#define DEVICE_NAME L"\\Ntfs" + #include typedef struct _BIOS_PARAMETERS_BLOCK { @@ -150,8 +151,18 @@ typedef struct _CCB #define TAG_CCB TAG('I', 'C', 'C', 'B') +#define NTFS_TYPE_GLOBAL_DATA TAG('F','S',0,7) + typedef struct { + ULONG Type; + ULONG Size; +} NTFSIDENTIFIER, *PNTFSIDENTIFIER; + +typedef struct +{ + NTFSIDENTIFIER Identifier; + ERESOURCE Resource; PDRIVER_OBJECT DriverObject; PDEVICE_OBJECT DeviceObject; ULONG Flags; @@ -544,8 +555,7 @@ NtfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject, /* ntfs.c */ -NTSTATUS STDCALL -DriverEntry(PDRIVER_OBJECT DriverObject, - PUNICODE_STRING RegistryPath); +DRIVER_INITIALIZE DriverEntry; +VOID NTAPI NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject); #endif /* NTFS_H */