From 7c372f9eab75de0a96ddce87fa52bf62f4118b8c Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Thu, 19 Nov 2015 13:13:29 -0800 Subject: [PATCH] sys: WIP --- src/sys/cleanup.c | 11 +++++++++++ src/sys/close.c | 11 +++++++++++ src/sys/create.c | 11 +++++++++++ src/sys/devctrl.c | 2 ++ src/sys/dirctrl.c | 2 ++ src/sys/driver.c | 16 +++++++++------- src/sys/driver.h | 39 ++++++++++++++++++++++++++++++++++++++- src/sys/ea.c | 4 ++++ src/sys/fileinfo.c | 4 ++++ src/sys/flush.c | 2 ++ src/sys/fsctrl.c | 2 ++ src/sys/lockctrl.c | 2 ++ src/sys/read.c | 2 ++ src/sys/security.c | 4 ++++ src/sys/shutdown.c | 2 ++ src/sys/volinfo.c | 4 ++++ src/sys/write.c | 2 ++ 17 files changed, 112 insertions(+), 8 deletions(-) diff --git a/src/sys/cleanup.c b/src/sys/cleanup.c index 8a88db04..cd3cd099 100644 --- a/src/sys/cleanup.c +++ b/src/sys/cleanup.c @@ -19,6 +19,17 @@ FspCleanup( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_CLEANUP == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + + if (FspFileSystemDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind) + { + Result = STATUS_SUCCESS; + Irp->IoStatus.Status = Result; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, FSP_IO_INCREMENT); + FSP_RETURN(); + } + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/close.c b/src/sys/close.c index 998e7a0f..88dc1d5e 100644 --- a/src/sys/close.c +++ b/src/sys/close.c @@ -19,6 +19,17 @@ FspClose( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_CLOSE == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + + if (FspFileSystemDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind) + { + Result = STATUS_SUCCESS; + Irp->IoStatus.Status = Result; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, FSP_IO_INCREMENT); + FSP_RETURN(); + } + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/create.c b/src/sys/create.c index 13283631..ea04a407 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -19,6 +19,17 @@ FspCreate( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_CREATE == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + + if (FspFileSystemDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind) + { + Result = STATUS_SUCCESS; + Irp->IoStatus.Status = Result; + Irp->IoStatus.Information = FILE_OPENED; + IoCompleteRequest(Irp, FSP_IO_INCREMENT); + FSP_RETURN(); + } + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/devctrl.c b/src/sys/devctrl.c index f3c741c5..ece5a391 100644 --- a/src/sys/devctrl.c +++ b/src/sys/devctrl.c @@ -19,6 +19,8 @@ FspDeviceControl( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_DEVICE_CONTROL == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/dirctrl.c b/src/sys/dirctrl.c index 31e192d5..8baafc4f 100644 --- a/src/sys/dirctrl.c +++ b/src/sys/dirctrl.c @@ -19,6 +19,8 @@ FspDirectoryControl( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_DIRECTORY_CONTROL == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/driver.c b/src/sys/driver.c index 59e525ac..e86ac25d 100644 --- a/src/sys/driver.c +++ b/src/sys/driver.c @@ -24,10 +24,12 @@ DriverEntry( /* create the file system device object */ UNICODE_STRING DeviceName; RtlInitUnicodeString(&DeviceName, L"\\Device\\" DEVICE_NAME); - Result = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_FILE_SYSTEM, 0, FALSE, - &FspDeviceObject); + Result = IoCreateDevice(DriverObject, + sizeof(FSP_FILE_SYSTEM_DEVICE_EXTENSION), &DeviceName, FILE_DEVICE_FILE_SYSTEM, 0, FALSE, + &FspFileSystemDeviceObject); if (!NT_SUCCESS(Result)) FSP_RETURN(); + FspDeviceExtension(FspFileSystemDeviceObject)->Kind = FspFileSystemDeviceExtensionKind; /* setup the driver object */ DriverObject->DriverUnload = FspUnload; @@ -96,7 +98,7 @@ DriverEntry( * Register as a file system; this informs all filter drivers. * Future drivers will *not* be informed because we are a FILE_DEVICE_FILE_SYSTEM! */ - IoRegisterFileSystem(FspDeviceObject); + IoRegisterFileSystem(FspFileSystemDeviceObject); FSP_LEAVE("DriverObject->DriverName=\"%wZ\", RegistryPath=\"%wZ\"", &DriverObject->DriverName, RegistryPath); @@ -108,14 +110,14 @@ FspUnload( { FSP_ENTER_VOID(PAGED_CODE()); - if (0 != FspDeviceObject) + if (0 != FspFileSystemDeviceObject) { - IoDeleteDevice(FspDeviceObject); - FspDeviceObject = 0; + IoDeleteDevice(FspFileSystemDeviceObject); + FspFileSystemDeviceObject = 0; } FSP_LEAVE_VOID("DriverObject->DriverName=\"%wZ\"", &DriverObject->DriverName); } -PDEVICE_OBJECT FspDeviceObject; +PDEVICE_OBJECT FspFileSystemDeviceObject; diff --git a/src/sys/driver.h b/src/sys/driver.h index bb26ca77..74d67a0c 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -73,6 +73,40 @@ const char *NtStatusSym(NTSTATUS Status); goto fsp_leave_label; \ } while (0,0) +/* types */ +enum +{ + FspFileSystemDeviceExtensionKind = 0, + FspVolumeDeviceExtensionKind, +}; +typedef struct +{ + UINT8 Kind; +} FSP_DEVICE_EXTENSION; +typedef struct +{ + FSP_DEVICE_EXTENSION Base; +} FSP_FILE_SYSTEM_DEVICE_EXTENSION; +typedef struct +{ + FSP_DEVICE_EXTENSION Base; +} FSP_VOLUME_DEVICE_EXTENSION; +static inline +FSP_DEVICE_EXTENSION *FspDeviceExtension(PDEVICE_OBJECT DeviceObject) +{ + return DeviceObject->DeviceExtension; +} +static inline +FSP_FILE_SYSTEM_DEVICE_EXTENSION *FspFileSystemDeviceExtension(PDEVICE_OBJECT DeviceObject) +{ + return DeviceObject->DeviceExtension; +} +static inline +FSP_VOLUME_DEVICE_EXTENSION *FspVolumeDeviceExtension(PDEVICE_OBJECT DeviceObject) +{ + return DeviceObject->DeviceExtension; +} + /* driver major functions */ DRIVER_DISPATCH FspCleanup; DRIVER_DISPATCH FspClose; @@ -106,7 +140,10 @@ FAST_IO_ACQUIRE_FOR_CCFLUSH FspAcquireForCcFlush; FAST_IO_RELEASE_FOR_CCFLUSH FspReleaseForCcFlush; /* extern */ -extern PDEVICE_OBJECT FspDeviceObject; +extern PDEVICE_OBJECT FspFileSystemDeviceObject; + +/* I/O increment */ +#define FSP_IO_INCREMENT IO_NETWORK_INCREMENT /* disable warnings */ #pragma warning(disable:4100) /* unreferenced formal parameter */ diff --git a/src/sys/ea.c b/src/sys/ea.c index 07379654..9646fe8b 100644 --- a/src/sys/ea.c +++ b/src/sys/ea.c @@ -21,6 +21,8 @@ FspQueryEa( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_QUERY_EA == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; @@ -35,6 +37,8 @@ FspSetEa( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_SET_EA == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 0aab88b4..f73e6be5 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -21,6 +21,8 @@ FspQueryInformation( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_QUERY_INFORMATION == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; @@ -35,6 +37,8 @@ FspSetInformation( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_SET_INFORMATION == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/flush.c b/src/sys/flush.c index 0233e61b..422c8c89 100644 --- a/src/sys/flush.c +++ b/src/sys/flush.c @@ -19,6 +19,8 @@ FspFlushBuffers( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_FLUSH_BUFFERS == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/fsctrl.c b/src/sys/fsctrl.c index 1659ecf8..d309465b 100644 --- a/src/sys/fsctrl.c +++ b/src/sys/fsctrl.c @@ -19,6 +19,8 @@ FspFileSystemControl( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_FILE_SYSTEM_CONTROL == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/lockctrl.c b/src/sys/lockctrl.c index 72b43773..7a9b7639 100644 --- a/src/sys/lockctrl.c +++ b/src/sys/lockctrl.c @@ -19,6 +19,8 @@ FspLockControl( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_LOCK_CONTROL == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/read.c b/src/sys/read.c index 9cdf607c..f037bf11 100644 --- a/src/sys/read.c +++ b/src/sys/read.c @@ -19,6 +19,8 @@ FspRead( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_READ == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/security.c b/src/sys/security.c index aa735319..952ceac0 100644 --- a/src/sys/security.c +++ b/src/sys/security.c @@ -21,6 +21,8 @@ FspQuerySecurity( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_QUERY_SECURITY == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; @@ -35,6 +37,8 @@ FspSetSecurity( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_SET_SECURITY == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/shutdown.c b/src/sys/shutdown.c index 371ee39c..67c16238 100644 --- a/src/sys/shutdown.c +++ b/src/sys/shutdown.c @@ -19,6 +19,8 @@ FspShutdown( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_SHUTDOWN == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/volinfo.c b/src/sys/volinfo.c index 6a6b101b..2983342a 100644 --- a/src/sys/volinfo.c +++ b/src/sys/volinfo.c @@ -21,6 +21,8 @@ FspQueryVolumeInformation( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_QUERY_VOLUME_INFORMATION == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; @@ -35,6 +37,8 @@ FspSetVolumeInformation( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_SET_VOLUME_INFORMATION == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/sys/write.c b/src/sys/write.c index 567fa941..14fdddfc 100644 --- a/src/sys/write.c +++ b/src/sys/write.c @@ -19,6 +19,8 @@ FspWrite( { FSP_ENTER(PAGED_CODE()); + ASSERT(IRP_MJ_WRITE == IoGetCurrentIrpStackLocation(Irp)->MajorFunction); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; IoCompleteRequest(Irp, IO_NO_INCREMENT); Result = STATUS_INVALID_DEVICE_REQUEST;