diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index bfff13cb..49bcddad 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -27,6 +27,13 @@ typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM; typedef VOID FSP_FILE_SYSTEM_DISPATCHER(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *); typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *); +typedef struct _FSP_FILE_SYSTEM_INTERFACE +{ + NTSTATUS (*AccessCheck)(FSP_FILE_SYSTEM *, + FSP_FSCTL_TRANSACT_REQ *, DWORD, PDWORD); + NTSTATUS (*QuerySecurity)(FSP_FILE_SYSTEM *, + PWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, SIZE_T *); +} FSP_FILE_SYSTEM_INTERFACE; typedef struct _FSP_FILE_SYSTEM { UINT16 Version; @@ -37,31 +44,41 @@ typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM_DISPATCHER *Dispatcher; FSP_FILE_SYSTEM_DISPATCHER *EnterOperation, *LeaveOperation; FSP_FILE_SYSTEM_OPERATION *Operations[FspFsctlTransactKindCount]; - NTSTATUS (*AccessCheck)(FSP_FILE_SYSTEM *, - FSP_FSCTL_TRANSACT_REQ *, DWORD, PDWORD); - NTSTATUS (*QuerySecurity)(FSP_FILE_SYSTEM *, - PWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, SIZE_T *); + const FSP_FILE_SYSTEM_INTERFACE *Interface; } FSP_FILE_SYSTEM; FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, const FSP_FSCTL_VOLUME_PARAMS *VolumeParams, - FSP_FILE_SYSTEM_DISPATCHER *Dispatcher, + const FSP_FILE_SYSTEM_INTERFACE *Interface, FSP_FILE_SYSTEM **PFileSystem); FSP_API VOID FspFileSystemDelete(FSP_FILE_SYSTEM *FileSystem); FSP_API NTSTATUS FspFileSystemLoop(FSP_FILE_SYSTEM *FileSystem); + FSP_API VOID FspFileSystemDirectDispatcher(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request); FSP_API VOID FspFileSystemPoolDispatcher(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request); +static inline +VOID FspFileSystemSetDispatcher(FSP_FILE_SYSTEM *FileSystem, + FSP_FILE_SYSTEM_DISPATCHER *Dispatcher, + FSP_FILE_SYSTEM_DISPATCHER *EnterOperation, + FSP_FILE_SYSTEM_DISPATCHER *LeaveOperation) +{ + FileSystem->Dispatcher = Dispatcher; + FileSystem->EnterOperation = EnterOperation; + FileSystem->LeaveOperation = LeaveOperation; +} -static VOID FspFileSystemGetDispatcherResult(FSP_FILE_SYSTEM *FileSystem, +static inline +VOID FspFileSystemGetDispatcherResult(FSP_FILE_SYSTEM *FileSystem, NTSTATUS *PDispatcherResult) { /* 32-bit reads are atomic */ *PDispatcherResult = FileSystem->DispatcherResult; MemoryBarrier(); } -static VOID FspFileSystemSetDispatcherResult(FSP_FILE_SYSTEM *FileSystem, +static inline +VOID FspFileSystemSetDispatcherResult(FSP_FILE_SYSTEM *FileSystem, NTSTATUS DispatcherResult) { if (NT_SUCCESS(DispatcherResult)) @@ -69,13 +86,15 @@ static VOID FspFileSystemSetDispatcherResult(FSP_FILE_SYSTEM *FileSystem, InterlockedCompareExchange(&FileSystem->DispatcherResult, DispatcherResult, 0); } -static VOID FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem, +static inline +VOID FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { if (0 != FileSystem->EnterOperation) FileSystem->EnterOperation(FileSystem, Request); } -static VOID FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem, +static inline +VOID FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { if (0 != FileSystem->LeaveOperation) diff --git a/src/dll/access.c b/src/dll/access.c index bf338a9a..72de5981 100644 --- a/src/dll/access.c +++ b/src/dll/access.c @@ -24,7 +24,7 @@ static NTSTATUS FspGetFileSecurityDescriptor(FSP_FILE_SYSTEM *FileSystem, { for (;;) { - NTSTATUS Result = FileSystem->QuerySecurity(FileSystem, + NTSTATUS Result = FileSystem->Interface->QuerySecurity(FileSystem, FileName, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, *PSecurityDescriptor, PSecurityDescriptorSize); @@ -42,10 +42,10 @@ FSP_API NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllowTraverseCheck, DWORD DesiredAccess, PDWORD PGrantedAccess) { - if (0 != FileSystem->AccessCheck) - return FileSystem->AccessCheck(FileSystem, Request, DesiredAccess, PGrantedAccess); + if (0 != FileSystem->Interface->AccessCheck) + return FileSystem->Interface->AccessCheck(FileSystem, Request, DesiredAccess, PGrantedAccess); - if (0 == FileSystem->QuerySecurity) + if (0 == FileSystem->Interface->QuerySecurity) { *PGrantedAccess = DesiredAccess; return STATUS_SUCCESS; diff --git a/src/dll/loop.c b/src/dll/loop.c index 2318c6be..93e3f57d 100644 --- a/src/dll/loop.c +++ b/src/dll/loop.c @@ -14,7 +14,7 @@ typedef struct _FSP_DISPATCHER_WORK_ITEM FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, const FSP_FSCTL_VOLUME_PARAMS *VolumeParams, - FSP_FILE_SYSTEM_DISPATCHER *Dispatcher, + const FSP_FILE_SYSTEM_INTERFACE *Interface, FSP_FILE_SYSTEM **PFileSystem) { NTSTATUS Result; @@ -22,6 +22,9 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, *PFileSystem = 0; + if (0 == Interface) + return STATUS_INVALID_PARAMETER; + FileSystem = MemAlloc(sizeof *FileSystem); if (0 == FileSystem) return STATUS_INSUFFICIENT_RESOURCES; @@ -36,7 +39,10 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, return Result; } - FileSystem->Dispatcher = 0 != Dispatcher ? Dispatcher : FspFileSystemDirectDispatcher; + FileSystem->Dispatcher = FspFileSystemDirectDispatcher; + FileSystem->Operations[FspFsctlTransactCreateKind] = 0; + // !!!: ... + FileSystem->Interface = Interface; *PFileSystem = FileSystem;