mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-24 09:23:37 -05:00
sys: decide on device hierarchy: fsctl, fsvrt, fsvol
This commit is contained in:
parent
4d910c7fa8
commit
93be122c91
@ -21,7 +21,7 @@ FspCleanup(
|
|||||||
|
|
||||||
ASSERT(IRP_MJ_CLEANUP == IrpSp->MajorFunction);
|
ASSERT(IRP_MJ_CLEANUP == IrpSp->MajorFunction);
|
||||||
|
|
||||||
if (FspFileSystemDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind)
|
if (FspFsctlDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind)
|
||||||
FSP_RETURN(Irp->IoStatus.Information = 0);
|
FSP_RETURN(Irp->IoStatus.Information = 0);
|
||||||
|
|
||||||
Result = STATUS_INVALID_DEVICE_REQUEST;
|
Result = STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
@ -21,7 +21,7 @@ FspClose(
|
|||||||
|
|
||||||
ASSERT(IRP_MJ_CLOSE == IrpSp->MajorFunction);
|
ASSERT(IRP_MJ_CLOSE == IrpSp->MajorFunction);
|
||||||
|
|
||||||
if (FspFileSystemDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind)
|
if (FspFsctlDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind)
|
||||||
FSP_RETURN(Irp->IoStatus.Information = 0);
|
FSP_RETURN(Irp->IoStatus.Information = 0);
|
||||||
|
|
||||||
Result = STATUS_INVALID_DEVICE_REQUEST;
|
Result = STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
@ -21,7 +21,7 @@ FspCreate(
|
|||||||
|
|
||||||
ASSERT(IRP_MJ_CREATE == IrpSp->MajorFunction);
|
ASSERT(IRP_MJ_CREATE == IrpSp->MajorFunction);
|
||||||
|
|
||||||
if (FspFileSystemDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind)
|
if (FspFsctlDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind)
|
||||||
FSP_RETURN(Irp->IoStatus.Information = FILE_OPENED);
|
FSP_RETURN(Irp->IoStatus.Information = FILE_OPENED);
|
||||||
|
|
||||||
Result = STATUS_INVALID_DEVICE_REQUEST;
|
Result = STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
@ -21,15 +21,22 @@ DriverEntry(
|
|||||||
{
|
{
|
||||||
FSP_ENTER();
|
FSP_ENTER();
|
||||||
|
|
||||||
/* create the file system device object */
|
/* create the file system control device objects */
|
||||||
UNICODE_STRING DeviceName;
|
UNICODE_STRING DeviceName;
|
||||||
RtlInitUnicodeString(&DeviceName, L"\\Device\\" DEVICE_NAME);
|
RtlInitUnicodeString(&DeviceName, L"\\Device\\" DISK_DEVICE_NAME);
|
||||||
Result = IoCreateDevice(DriverObject,
|
Result = IoCreateDevice(DriverObject,
|
||||||
sizeof(FSP_FILE_SYSTEM_DEVICE_EXTENSION), &DeviceName, FILE_DEVICE_FILE_SYSTEM, 0, FALSE,
|
sizeof(FSP_FSCTL_DEVICE_EXTENSION), &DeviceName, FILE_DEVICE_DISK_FILE_SYSTEM, 0, FALSE,
|
||||||
&FspFileSystemDeviceObject);
|
&FspFsctlDiskDeviceObject);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
FSP_RETURN();
|
FSP_RETURN();
|
||||||
FspDeviceExtension(FspFileSystemDeviceObject)->Kind = FspFileSystemDeviceExtensionKind;
|
RtlInitUnicodeString(&DeviceName, L"\\Device\\" NET_DEVICE_NAME);
|
||||||
|
Result = IoCreateDevice(DriverObject,
|
||||||
|
sizeof(FSP_FSCTL_DEVICE_EXTENSION), &DeviceName, FILE_DEVICE_NETWORK_FILE_SYSTEM, 0, FALSE,
|
||||||
|
&FspFsctlNetDeviceObject);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
FSP_RETURN(IoDeleteDevice(FspFsctlDiskDeviceObject));
|
||||||
|
FspDeviceExtension(FspFsctlDiskDeviceObject)->Kind = FspFsctlDeviceExtensionKind;
|
||||||
|
FspDeviceExtension(FspFsctlNetDeviceObject)->Kind = FspFsctlDeviceExtensionKind;
|
||||||
|
|
||||||
/* setup the driver object */
|
/* setup the driver object */
|
||||||
DriverObject->DriverUnload = FspUnload;
|
DriverObject->DriverUnload = FspUnload;
|
||||||
@ -94,11 +101,9 @@ DriverEntry(
|
|||||||
FspFastIoDispatch.ReleaseForCcFlush = FspReleaseForCcFlush;
|
FspFastIoDispatch.ReleaseForCcFlush = FspReleaseForCcFlush;
|
||||||
DriverObject->FastIoDispatch = &FspFastIoDispatch;
|
DriverObject->FastIoDispatch = &FspFastIoDispatch;
|
||||||
|
|
||||||
/*
|
/* register our device objects as file systems */
|
||||||
* Register as a file system; this informs all filter drivers.
|
IoRegisterFileSystem(FspFsctlDiskDeviceObject);
|
||||||
* Future drivers will *not* be informed because we are a FILE_DEVICE_FILE_SYSTEM!
|
IoRegisterFileSystem(FspFsctlNetDeviceObject);
|
||||||
*/
|
|
||||||
IoRegisterFileSystem(FspFileSystemDeviceObject);
|
|
||||||
|
|
||||||
FSP_LEAVE("DriverName=\"%wZ\", RegistryPath=\"%wZ\"",
|
FSP_LEAVE("DriverName=\"%wZ\", RegistryPath=\"%wZ\"",
|
||||||
&DriverObject->DriverName, RegistryPath);
|
&DriverObject->DriverName, RegistryPath);
|
||||||
@ -110,14 +115,20 @@ FspUnload(
|
|||||||
{
|
{
|
||||||
FSP_ENTER_VOID(PAGED_CODE());
|
FSP_ENTER_VOID(PAGED_CODE());
|
||||||
|
|
||||||
if (0 != FspFileSystemDeviceObject)
|
if (0 != FspFsctlDiskDeviceObject)
|
||||||
{
|
{
|
||||||
IoDeleteDevice(FspFileSystemDeviceObject);
|
IoDeleteDevice(FspFsctlDiskDeviceObject);
|
||||||
FspFileSystemDeviceObject = 0;
|
FspFsctlDiskDeviceObject = 0;
|
||||||
|
}
|
||||||
|
if (0 != FspFsctlNetDeviceObject)
|
||||||
|
{
|
||||||
|
IoDeleteDevice(FspFsctlNetDeviceObject);
|
||||||
|
FspFsctlNetDeviceObject = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
FSP_LEAVE_VOID("DriverName=\"%wZ\"",
|
FSP_LEAVE_VOID("DriverName=\"%wZ\"",
|
||||||
&DriverObject->DriverName);
|
&DriverObject->DriverName);
|
||||||
}
|
}
|
||||||
|
|
||||||
PDEVICE_OBJECT FspFileSystemDeviceObject;
|
PDEVICE_OBJECT FspFsctlDiskDeviceObject;
|
||||||
|
PDEVICE_OBJECT FspFsctlNetDeviceObject;
|
||||||
|
@ -10,7 +10,8 @@
|
|||||||
#include <ntifs.h>
|
#include <ntifs.h>
|
||||||
|
|
||||||
#define DRIVER_NAME "WinFsp"
|
#define DRIVER_NAME "WinFsp"
|
||||||
#define DEVICE_NAME "WinFsp"
|
#define DISK_DEVICE_NAME "WinFsp.Disk"
|
||||||
|
#define NET_DEVICE_NAME "WinFsp.Net"
|
||||||
|
|
||||||
/* DEBUGLOG */
|
/* DEBUGLOG */
|
||||||
#if DBG
|
#if DBG
|
||||||
@ -100,8 +101,9 @@
|
|||||||
/* types */
|
/* types */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
FspFileSystemDeviceExtensionKind = 'F',
|
FspFsctlDeviceExtensionKind = 'C', /* file system control device (e.g. \Device\WinFsp.Disk) */
|
||||||
FspVolumeDeviceExtensionKind = 'V',
|
FspFsvrtDeviceExtensionKind = 'V', /* virtual volume device (e.g. \Device\Volume{GUID}) */
|
||||||
|
FspFsvolDeviceExtensionKind = 'F', /* file system volume device (unnamed) */
|
||||||
};
|
};
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@ -110,23 +112,32 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
FSP_DEVICE_EXTENSION Base;
|
FSP_DEVICE_EXTENSION Base;
|
||||||
} FSP_FILE_SYSTEM_DEVICE_EXTENSION;
|
} FSP_FSCTL_DEVICE_EXTENSION;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
FSP_DEVICE_EXTENSION Base;
|
FSP_DEVICE_EXTENSION Base;
|
||||||
} FSP_VOLUME_DEVICE_EXTENSION;
|
} FSP_FSVRT_DEVICE_EXTENSION;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
FSP_DEVICE_EXTENSION Base;
|
||||||
|
} FSP_FSVOL_DEVICE_EXTENSION;
|
||||||
static inline
|
static inline
|
||||||
FSP_DEVICE_EXTENSION *FspDeviceExtension(PDEVICE_OBJECT DeviceObject)
|
FSP_DEVICE_EXTENSION *FspDeviceExtension(PDEVICE_OBJECT DeviceObject)
|
||||||
{
|
{
|
||||||
return DeviceObject->DeviceExtension;
|
return DeviceObject->DeviceExtension;
|
||||||
}
|
}
|
||||||
static inline
|
static inline
|
||||||
FSP_FILE_SYSTEM_DEVICE_EXTENSION *FspFileSystemDeviceExtension(PDEVICE_OBJECT DeviceObject)
|
FSP_FSCTL_DEVICE_EXTENSION *FspFsctlDeviceExtension(PDEVICE_OBJECT DeviceObject)
|
||||||
{
|
{
|
||||||
return DeviceObject->DeviceExtension;
|
return DeviceObject->DeviceExtension;
|
||||||
}
|
}
|
||||||
static inline
|
static inline
|
||||||
FSP_VOLUME_DEVICE_EXTENSION *FspVolumeDeviceExtension(PDEVICE_OBJECT DeviceObject)
|
FSP_FSVRT_DEVICE_EXTENSION *FspFsvrtDeviceExtension(PDEVICE_OBJECT DeviceObject)
|
||||||
|
{
|
||||||
|
return DeviceObject->DeviceExtension;
|
||||||
|
}
|
||||||
|
static inline
|
||||||
|
FSP_FSVOL_DEVICE_EXTENSION *FspFsvolDeviceExtension(PDEVICE_OBJECT DeviceObject)
|
||||||
{
|
{
|
||||||
return DeviceObject->DeviceExtension;
|
return DeviceObject->DeviceExtension;
|
||||||
}
|
}
|
||||||
@ -172,7 +183,8 @@ const char *IrpMinorFunctionSym(UCHAR MajorFunction, UCHAR MinorFunction);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* extern */
|
/* extern */
|
||||||
extern PDEVICE_OBJECT FspFileSystemDeviceObject;
|
extern PDEVICE_OBJECT FspFsctlDiskDeviceObject;
|
||||||
|
extern PDEVICE_OBJECT FspFsctlNetDeviceObject;
|
||||||
|
|
||||||
/* I/O increment */
|
/* I/O increment */
|
||||||
#define FSP_IO_INCREMENT IO_NETWORK_INCREMENT
|
#define FSP_IO_INCREMENT IO_NETWORK_INCREMENT
|
||||||
|
Loading…
x
Reference in New Issue
Block a user