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;
-}