dll: FSP_FILE_SYSTEM_OPERATION_GUARD now returns NTSTATUS

This commit is contained in:
Bill Zissimopoulos 2016-06-08 22:15:24 -07:00
parent b0b15dff05
commit 0e8d694bdd
6 changed files with 72 additions and 15 deletions

View File

@ -50,7 +50,7 @@ extern "C" {
* FSP_FILE_SYSTEM_INTERFACE operations.
*/
typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM;
typedef VOID FSP_FILE_SYSTEM_OPERATION_GUARD(FSP_FILE_SYSTEM *,
typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION_GUARD(FSP_FILE_SYSTEM *,
FSP_FSCTL_TRANSACT_REQ *, FSP_FSCTL_TRANSACT_RSP *);
typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION(FSP_FILE_SYSTEM *,
FSP_FSCTL_TRANSACT_REQ *, FSP_FSCTL_TRANSACT_RSP *);
@ -701,18 +701,22 @@ PWSTR FspFileSystemMountPoint(FSP_FILE_SYSTEM *FileSystem)
return FileSystem->MountPoint;
}
static inline
VOID FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem,
NTSTATUS FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
{
if (0 != FileSystem->EnterOperation)
FileSystem->EnterOperation(FileSystem, Request, Response);
if (0 == FileSystem->EnterOperation)
return STATUS_SUCCESS;
return FileSystem->EnterOperation(FileSystem, Request, Response);
}
static inline
VOID FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem,
NTSTATUS FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
{
if (0 != FileSystem->LeaveOperation)
FileSystem->LeaveOperation(FileSystem, Request, Response);
if (0 == FileSystem->LeaveOperation)
return STATUS_SUCCESS;
return FileSystem->LeaveOperation(FileSystem, Request, Response);
}
static inline
VOID FspFileSystemSetOperationGuard(FSP_FILE_SYSTEM *FileSystem,
@ -761,9 +765,9 @@ VOID FspFileSystemSetDebugLog(FSP_FILE_SYSTEM *FileSystem,
/*
* Operations
*/
FSP_API VOID FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem,
FSP_API NTSTATUS FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
FSP_API VOID FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem,
FSP_API NTSTATUS FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);

View File

@ -283,10 +283,14 @@ static DWORD WINAPI FspFileSystemDispatcherThread(PVOID FileSystem0)
Response->Hint = Request->Hint;
if (FspFsctlTransactKindCount > Request->Kind && 0 != FileSystem->Operations[Request->Kind])
{
FspFileSystemEnterOperation(FileSystem, Request, Response);
Response->IoStatus.Status =
FileSystem->Operations[Request->Kind](FileSystem, Request, Response);
FspFileSystemLeaveOperation(FileSystem, Request, Response);
FspFileSystemEnterOperation(FileSystem, Request, Response);
if (NT_SUCCESS(Response->IoStatus.Status))
{
Response->IoStatus.Status =
FileSystem->Operations[Request->Kind](FileSystem, Request, Response);
FspFileSystemLeaveOperation(FileSystem, Request, Response);
}
}
else
Response->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;

View File

@ -37,7 +37,7 @@
* guarded by a mutually exclusive lock.
*/
FSP_API VOID FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem,
FSP_API NTSTATUS FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
{
switch (FileSystem->OpGuardStrategy)
@ -68,9 +68,11 @@ FSP_API VOID FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem,
AcquireSRWLockExclusive(&FileSystem->OpGuardLock);
break;
}
return STATUS_SUCCESS;
}
FSP_API VOID FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem,
FSP_API NTSTATUS FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
{
switch (FileSystem->OpGuardStrategy)
@ -101,6 +103,8 @@ FSP_API VOID FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem,
ReleaseSRWLockExclusive(&FileSystem->OpGuardLock);
break;
}
return STATUS_SUCCESS;
}
static inline

View File

@ -343,6 +343,7 @@ static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
}
f->FileSystem->UserContext = f;
FspFileSystemSetOperationGuard(f->FileSystem, fsp_fuse_op_enter, fsp_fuse_op_leave);
FspFileSystemSetDebugLog(f->FileSystem, f->DebugLog);
if (L'\0' != f->MountPoint)

View File

@ -17,7 +17,7 @@
#include <dll/fuse/library.h>
static NTSTATUS fsp_fuse_intf_set_context(FSP_FILE_SYSTEM *FileSystem, HANDLE Token)
static NTSTATUS fsp_fuse_op_set_context(FSP_FILE_SYSTEM *FileSystem, HANDLE Token)
{
struct fuse_context *context;
UINT32 Uid = -1, Gid = -1;
@ -114,6 +114,33 @@ exit:
return Result;
}
NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
{
NTSTATUS Result;
Result = FspFileSystemOpEnter(FileSystem, Request, Response);
if (!NT_SUCCESS(Result))
return Result;
return fsp_fuse_op_set_context(FileSystem, 0);
}
NTSTATUS fsp_fuse_op_leave(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
{
struct fuse_context *context;
context = fsp_fuse_get_context(0);
context->fuse = 0;
context->uid = 0;
context->gid = 0;
FspFileSystemOpLeave(FileSystem, Request, Response);
return STATUS_SUCCESS;
}
NTSTATUS fsp_fuse_intf_GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request,
FSP_FSCTL_VOLUME_INFO *VolumeInfo)
@ -208,6 +235,18 @@ NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions,
PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo)
{
#if 0
struct fuse *f = FileSystem->UserContext;
struct fuse_file_info fi;
char *PosixPath = 0;
int err;
NTSTATUS Result;
if (0 == f->ops.open)
return STATUS_INVALID_DEVICE_REQUEST;
err = f->ops.open(PosixPath, &fi);
#endif
return STATUS_INVALID_DEVICE_REQUEST;
}

View File

@ -37,6 +37,11 @@ struct fuse
BOOLEAN fsinit;
};
NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
NTSTATUS fsp_fuse_op_leave(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
extern FSP_FILE_SYSTEM_INTERFACE fsp_fuse_intf;
#endif