mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
dll: FSP_FILE_SYSTEM_OPERATION_GUARD now returns NTSTATUS
This commit is contained in:
parent
b0b15dff05
commit
0e8d694bdd
@ -50,7 +50,7 @@ extern "C" {
|
|||||||
* FSP_FILE_SYSTEM_INTERFACE operations.
|
* FSP_FILE_SYSTEM_INTERFACE operations.
|
||||||
*/
|
*/
|
||||||
typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM;
|
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 *);
|
FSP_FSCTL_TRANSACT_REQ *, FSP_FSCTL_TRANSACT_RSP *);
|
||||||
typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION(FSP_FILE_SYSTEM *,
|
typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION(FSP_FILE_SYSTEM *,
|
||||||
FSP_FSCTL_TRANSACT_REQ *, FSP_FSCTL_TRANSACT_RSP *);
|
FSP_FSCTL_TRANSACT_REQ *, FSP_FSCTL_TRANSACT_RSP *);
|
||||||
@ -701,18 +701,22 @@ PWSTR FspFileSystemMountPoint(FSP_FILE_SYSTEM *FileSystem)
|
|||||||
return FileSystem->MountPoint;
|
return FileSystem->MountPoint;
|
||||||
}
|
}
|
||||||
static inline
|
static inline
|
||||||
VOID FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem,
|
NTSTATUS FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
{
|
{
|
||||||
if (0 != FileSystem->EnterOperation)
|
if (0 == FileSystem->EnterOperation)
|
||||||
FileSystem->EnterOperation(FileSystem, Request, Response);
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
return FileSystem->EnterOperation(FileSystem, Request, Response);
|
||||||
}
|
}
|
||||||
static inline
|
static inline
|
||||||
VOID FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem,
|
NTSTATUS FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
{
|
{
|
||||||
if (0 != FileSystem->LeaveOperation)
|
if (0 == FileSystem->LeaveOperation)
|
||||||
FileSystem->LeaveOperation(FileSystem, Request, Response);
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
return FileSystem->LeaveOperation(FileSystem, Request, Response);
|
||||||
}
|
}
|
||||||
static inline
|
static inline
|
||||||
VOID FspFileSystemSetOperationGuard(FSP_FILE_SYSTEM *FileSystem,
|
VOID FspFileSystemSetOperationGuard(FSP_FILE_SYSTEM *FileSystem,
|
||||||
@ -761,9 +765,9 @@ VOID FspFileSystemSetDebugLog(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
/*
|
/*
|
||||||
* Operations
|
* 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_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_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
|
@ -283,11 +283,15 @@ static DWORD WINAPI FspFileSystemDispatcherThread(PVOID FileSystem0)
|
|||||||
Response->Hint = Request->Hint;
|
Response->Hint = Request->Hint;
|
||||||
if (FspFsctlTransactKindCount > Request->Kind && 0 != FileSystem->Operations[Request->Kind])
|
if (FspFsctlTransactKindCount > Request->Kind && 0 != FileSystem->Operations[Request->Kind])
|
||||||
{
|
{
|
||||||
|
Response->IoStatus.Status =
|
||||||
FspFileSystemEnterOperation(FileSystem, Request, Response);
|
FspFileSystemEnterOperation(FileSystem, Request, Response);
|
||||||
|
if (NT_SUCCESS(Response->IoStatus.Status))
|
||||||
|
{
|
||||||
Response->IoStatus.Status =
|
Response->IoStatus.Status =
|
||||||
FileSystem->Operations[Request->Kind](FileSystem, Request, Response);
|
FileSystem->Operations[Request->Kind](FileSystem, Request, Response);
|
||||||
FspFileSystemLeaveOperation(FileSystem, Request, Response);
|
FspFileSystemLeaveOperation(FileSystem, Request, Response);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
Response->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
|
Response->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
* guarded by a mutually exclusive lock.
|
* 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)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
{
|
{
|
||||||
switch (FileSystem->OpGuardStrategy)
|
switch (FileSystem->OpGuardStrategy)
|
||||||
@ -68,9 +68,11 @@ FSP_API VOID FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
AcquireSRWLockExclusive(&FileSystem->OpGuardLock);
|
AcquireSRWLockExclusive(&FileSystem->OpGuardLock);
|
||||||
break;
|
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)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
{
|
{
|
||||||
switch (FileSystem->OpGuardStrategy)
|
switch (FileSystem->OpGuardStrategy)
|
||||||
@ -101,6 +103,8 @@ FSP_API VOID FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
ReleaseSRWLockExclusive(&FileSystem->OpGuardLock);
|
ReleaseSRWLockExclusive(&FileSystem->OpGuardLock);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
|
@ -343,6 +343,7 @@ static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
f->FileSystem->UserContext = f;
|
f->FileSystem->UserContext = f;
|
||||||
|
FspFileSystemSetOperationGuard(f->FileSystem, fsp_fuse_op_enter, fsp_fuse_op_leave);
|
||||||
FspFileSystemSetDebugLog(f->FileSystem, f->DebugLog);
|
FspFileSystemSetDebugLog(f->FileSystem, f->DebugLog);
|
||||||
|
|
||||||
if (L'\0' != f->MountPoint)
|
if (L'\0' != f->MountPoint)
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
#include <dll/fuse/library.h>
|
#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;
|
struct fuse_context *context;
|
||||||
UINT32 Uid = -1, Gid = -1;
|
UINT32 Uid = -1, Gid = -1;
|
||||||
@ -114,6 +114,33 @@ exit:
|
|||||||
return Result;
|
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,
|
NTSTATUS fsp_fuse_intf_GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request,
|
FSP_FSCTL_TRANSACT_REQ *Request,
|
||||||
FSP_FSCTL_VOLUME_INFO *VolumeInfo)
|
FSP_FSCTL_VOLUME_INFO *VolumeInfo)
|
||||||
@ -208,6 +235,18 @@ NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions,
|
PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions,
|
||||||
PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo)
|
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;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,11 @@ struct fuse
|
|||||||
BOOLEAN fsinit;
|
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;
|
extern FSP_FILE_SYSTEM_INTERFACE fsp_fuse_intf;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user