diff --git a/build/VStudio/winfsp_sys.vcxproj b/build/VStudio/winfsp_sys.vcxproj index 2b7e4d5f..06f38c94 100644 --- a/build/VStudio/winfsp_sys.vcxproj +++ b/build/VStudio/winfsp_sys.vcxproj @@ -139,6 +139,7 @@ + diff --git a/build/VStudio/winfsp_sys.vcxproj.filters b/build/VStudio/winfsp_sys.vcxproj.filters index ce080be4..cf1748c9 100644 --- a/build/VStudio/winfsp_sys.vcxproj.filters +++ b/build/VStudio/winfsp_sys.vcxproj.filters @@ -80,6 +80,9 @@ Source + + Source + diff --git a/src/sys/device.c b/src/sys/device.c new file mode 100644 index 00000000..d7803a3b --- /dev/null +++ b/src/sys/device.c @@ -0,0 +1,149 @@ +/** + * @file sys/device.c + * + * @copyright 2015 Bill Zissimopoulos + */ + +#include + +NTSTATUS FspDeviceCreateList( + PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount); +VOID FspDeviceDeleteList( + PDEVICE_OBJECT *DeviceObjects, ULONG DeviceObjectCount); +NTSTATUS FspDeviceOwned( + PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DeviceObject); +static VOID FspFsctlDeviceDeleteObject(PDEVICE_OBJECT DeviceObject); +static VOID FspFsvrtDeviceDeleteObject(PDEVICE_OBJECT DeviceObject); +static VOID FspFsvolDeviceDeleteObject(PDEVICE_OBJECT DeviceObject); +VOID FspDeviceDeleteObject(PDEVICE_OBJECT DeviceObject); +VOID FspDeviceDeleteObjects(PDRIVER_OBJECT DriverObject); + +#ifdef ALLOC_PRAGMA +#pragma alloc_text(PAGE, FspDeviceCreateList) +#pragma alloc_text(PAGE, FspDeviceDeleteList) +#pragma alloc_text(PAGE, FspDeviceOwned) +#pragma alloc_text(PAGE, FspFsctlDeviceDeleteObject) +#pragma alloc_text(PAGE, FspFsvrtDeviceDeleteObject) +#pragma alloc_text(PAGE, FspFsvolDeviceDeleteObject) +#pragma alloc_text(PAGE, FspDeviceDeleteObject) +#pragma alloc_text(PAGE, FspDeviceDeleteObjects) +#endif + +NTSTATUS FspDeviceCreateList( + PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount) +{ + PAGED_CODE(); + + PDEVICE_OBJECT *DeviceObjects = 0; + ULONG DeviceObjectCount = 0; + + while (STATUS_BUFFER_TOO_SMALL == IoEnumerateDeviceObjectList(DriverObject, + DeviceObjects, DeviceObjectCount, &DeviceObjectCount)) + { + if (0 != DeviceObjects) + ExFreePoolWithTag(DeviceObjects, FSP_TAG); + DeviceObjects = ExAllocatePoolWithTag(NonPagedPool, + sizeof *DeviceObjects * DeviceObjectCount, FSP_TAG); + if (0 == DeviceObjects) + return STATUS_INSUFFICIENT_RESOURCES; + RtlZeroMemory(DeviceObjects, sizeof *DeviceObjects * DeviceObjectCount); + } + + *PDeviceObjects = DeviceObjects; + *PDeviceObjectCount = DeviceObjectCount; + + return STATUS_SUCCESS; +} + +VOID FspDeviceDeleteList( + PDEVICE_OBJECT *DeviceObjects, ULONG DeviceObjectCount) +{ + PAGED_CODE(); + + for (ULONG i = 0; DeviceObjectCount > i; i++) + ObDereferenceObject(DeviceObjects[i]); + + ExFreePoolWithTag(DeviceObjects, FSP_TAG); +} + +NTSTATUS FspDeviceOwned( + PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DeviceObject) +{ + PAGED_CODE(); + + NTSTATUS Result = STATUS_NO_SUCH_DEVICE; + PDEVICE_OBJECT *DeviceObjects = 0; + ULONG DeviceObjectCount = 0; + + Result = FspDeviceCreateList(DriverObject, &DeviceObjects, &DeviceObjectCount); + if (!NT_SUCCESS(Result)) + return Result; + + for (ULONG i = 0; DeviceObjectCount > i; i++) + if (DeviceObjects[i] == DeviceObject) + { + Result = STATUS_SUCCESS; + break; + } + + FspDeviceDeleteList(DeviceObjects, DeviceObjectCount); + + return Result; +} + +static VOID FspFsctlDeviceDeleteObject(PDEVICE_OBJECT DeviceObject) +{ + PAGED_CODE(); + + IoDeleteDevice(DeviceObject); +} + +static VOID FspFsvrtDeviceDeleteObject(PDEVICE_OBJECT DeviceObject) +{ + PAGED_CODE(); + + IoDeleteDevice(DeviceObject); +} + +static VOID FspFsvolDeviceDeleteObject(PDEVICE_OBJECT DeviceObject) +{ + PAGED_CODE(); + + IoDeleteDevice(DeviceObject); +} + +VOID FspDeviceDeleteObject(PDEVICE_OBJECT DeviceObject) +{ + PAGED_CODE(); + + switch (FspDeviceExtension(DeviceObject)->Kind) + { + case FspFsvolDeviceExtensionKind: + FspFsvolDeviceDeleteObject(DeviceObject); + break; + case FspFsvrtDeviceExtensionKind: + FspFsvrtDeviceDeleteObject(DeviceObject); + break; + case FspFsctlDeviceExtensionKind: + FspFsctlDeviceDeleteObject(DeviceObject); + break; + } +} + +VOID FspDeviceDeleteObjects(PDRIVER_OBJECT DriverObject) +{ + PAGED_CODE(); + + NTSTATUS Result; + PDEVICE_OBJECT *DeviceObjects = 0; + ULONG DeviceObjectCount = 0; + + Result = FspDeviceCreateList(DriverObject, &DeviceObjects, &DeviceObjectCount); + if (!NT_SUCCESS(Result)) + return; + + for (ULONG i = 0; DeviceObjectCount > i; i++) + FspDeviceDeleteObject(DeviceObjects[i]); + + FspDeviceDeleteList(DeviceObjects, DeviceObjectCount); +} diff --git a/src/sys/driver.h b/src/sys/driver.h index 9d8f0be2..63ab5787 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -286,6 +286,14 @@ FSP_FSVOL_DEVICE_EXTENSION *FspFsvolDeviceExtension(PDEVICE_OBJECT DeviceObject) ASSERT(FspFsvolDeviceExtensionKind == ((FSP_DEVICE_EXTENSION *)DeviceObject->DeviceExtension)->Kind); return DeviceObject->DeviceExtension; } +NTSTATUS FspDeviceCreateList( + PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount); +VOID FspDeviceDeleteList( + PDEVICE_OBJECT *DeviceObjects, ULONG DeviceObjectCount); +NTSTATUS FspDeviceOwned( + PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DeviceObject); +VOID FspDeviceDeleteObject(PDEVICE_OBJECT DeviceObject); +VOID FspDeviceDeleteObjects(PDRIVER_OBJECT DriverObject); /* I/O processing */ VOID FspIopCompleteRequest(PIRP Irp, NTSTATUS Result); @@ -295,12 +303,6 @@ VOID FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response); NTSTATUS FspCreateGuid(GUID *Guid); NTSTATUS FspSecuritySubjectContextAccessCheck( PSECURITY_DESCRIPTOR SecurityDescriptor, ACCESS_MASK DesiredAccess, KPROCESSOR_MODE AccessMode); -NTSTATUS FspCreateDeviceObjectList( - PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount); -VOID FspDeleteDeviceObjectList( - PDEVICE_OBJECT *DeviceObjects, ULONG DeviceObjectCount); -NTSTATUS FspHasDeviceObject( - PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DeviceObject); /* debug */ #if DBG diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index a1eb6f29..510036f5 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -116,7 +116,7 @@ static NTSTATUS FspFsctlMountVolume( FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; /* check the passed in volume object; it must be one of our own */ - Result = FspHasDeviceObject(DeviceObject->DriverObject, FsvrtDeviceObject); + Result = FspDeviceOwned(DeviceObject->DriverObject, FsvrtDeviceObject); if (!NT_SUCCESS(Result)) { if (STATUS_NO_SUCH_DEVICE == Result) diff --git a/src/sys/misc.c b/src/sys/misc.c index 16e9ed38..6749a5d5 100644 --- a/src/sys/misc.c +++ b/src/sys/misc.c @@ -49,59 +49,3 @@ NTSTATUS FspSecuritySubjectContextAccessCheck( return Result; } - -NTSTATUS FspCreateDeviceObjectList( - PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount) -{ - PDEVICE_OBJECT *DeviceObjects = 0; - ULONG DeviceObjectCount = 0; - - while (STATUS_BUFFER_TOO_SMALL == IoEnumerateDeviceObjectList(DriverObject, - DeviceObjects, DeviceObjectCount, &DeviceObjectCount)) - { - if (0 != DeviceObjects) - ExFreePoolWithTag(DeviceObjects, FSP_TAG); - DeviceObjects = ExAllocatePoolWithTag(NonPagedPool, - sizeof *DeviceObjects * DeviceObjectCount, FSP_TAG); - if (0 == DeviceObjects) - return STATUS_INSUFFICIENT_RESOURCES; - RtlZeroMemory(DeviceObjects, sizeof *DeviceObjects * DeviceObjectCount); - } - - *PDeviceObjects = DeviceObjects; - *PDeviceObjectCount = DeviceObjectCount; - - return STATUS_SUCCESS; -} - -VOID FspDeleteDeviceObjectList( - PDEVICE_OBJECT *DeviceObjects, ULONG DeviceObjectCount) -{ - for (ULONG i = 0; DeviceObjectCount > i; i++) - ObDereferenceObject(DeviceObjects[i]); - - ExFreePoolWithTag(DeviceObjects, FSP_TAG); -} - -NTSTATUS FspHasDeviceObject( - PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DeviceObject) -{ - NTSTATUS Result = STATUS_NO_SUCH_DEVICE; - PDEVICE_OBJECT *DeviceObjects = 0; - ULONG DeviceObjectCount = 0; - - Result = FspCreateDeviceObjectList(DriverObject, &DeviceObjects, &DeviceObjectCount); - if (!NT_SUCCESS(Result)) - return Result; - - for (ULONG i = 0; DeviceObjectCount > i; i++) - if (DeviceObjects[i] == DeviceObject) - { - Result = STATUS_SUCCESS; - break; - } - - FspDeleteDeviceObjectList(DeviceObjects, DeviceObjectCount); - - return Result; -}