mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
dll: FspShareAccessRemove in cleanup
This commit is contained in:
parent
0d7a6f5ce6
commit
aad518ac27
@ -123,6 +123,12 @@ typedef struct
|
|||||||
{
|
{
|
||||||
UINT64 UserContext;
|
UINT64 UserContext;
|
||||||
UINT64 UserContext2;
|
UINT64 UserContext2;
|
||||||
|
UINT32 ReadAccess:1; /* file was open for read access */
|
||||||
|
UINT32 WriteAccess:1; /* file was open for write access */
|
||||||
|
UINT32 DeleteAccess:1; /* file was open for delete access */
|
||||||
|
UINT32 SharedRead:1; /* file was open for shared read access */
|
||||||
|
UINT32 SharedWrite:1; /* file was open for shared write access */
|
||||||
|
UINT32 SharedDelete:1; /* file was open for shared delete access */
|
||||||
} Cleanup;
|
} Cleanup;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -189,8 +189,10 @@ FSP_API PGENERIC_MAPPING FspGetFileGenericMapping(VOID);
|
|||||||
FSP_API NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck,
|
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck,
|
||||||
DWORD DesiredAccess, PDWORD PGrantedAccess);
|
DWORD DesiredAccess, PDWORD PGrantedAccess);
|
||||||
FSP_API NTSTATUS FspShareCheck(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspShareAccessCheck(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, DWORD GrantedAccess, FSP_FILE_NODE *FileNode);
|
FSP_FSCTL_TRANSACT_REQ *Request, DWORD GrantedAccess, FSP_FILE_NODE *FileNode);
|
||||||
|
FSP_API VOID FspShareAccessRemove(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode);
|
||||||
FSP_API NTSTATUS FspFileSystemPreCreateCheck(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemPreCreateCheck(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllowTraverseCheck, PDWORD PGrantedAccess);
|
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllowTraverseCheck, PDWORD PGrantedAccess);
|
||||||
FSP_API VOID FspFileSystemPostCreateCheck(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API VOID FspFileSystemPostCreateCheck(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
@ -6,6 +6,23 @@
|
|||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
|
||||||
|
FSP_API VOID FspShareAccessRemove(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode)
|
||||||
|
{
|
||||||
|
if (Request->Req.Cleanup.ReadAccess ||
|
||||||
|
Request->Req.Cleanup.WriteAccess ||
|
||||||
|
Request->Req.Cleanup.DeleteAccess)
|
||||||
|
{
|
||||||
|
FileNode->ShareAccess.OpenCount--;
|
||||||
|
FileNode->ShareAccess.Readers -= Request->Req.Cleanup.ReadAccess;
|
||||||
|
FileNode->ShareAccess.Writers -= Request->Req.Cleanup.WriteAccess;
|
||||||
|
FileNode->ShareAccess.Deleters -= Request->Req.Cleanup.DeleteAccess;
|
||||||
|
FileNode->ShareAccess.SharedRead -= Request->Req.Cleanup.SharedRead;
|
||||||
|
FileNode->ShareAccess.SharedWrite -= Request->Req.Cleanup.SharedWrite;
|
||||||
|
FileNode->ShareAccess.SharedDelete -= Request->Req.Cleanup.SharedDelete;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request)
|
FSP_FSCTL_TRANSACT_REQ *Request)
|
||||||
{
|
{
|
||||||
@ -18,6 +35,8 @@ FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
|
|
||||||
FspFileNodeLock(FileNode);
|
FspFileNodeLock(FileNode);
|
||||||
|
|
||||||
|
FspShareAccessRemove(FileSystem, Request, FileNode);
|
||||||
|
|
||||||
/* propagate the DeleteOnClose flag to DeletePending */
|
/* propagate the DeleteOnClose flag to DeletePending */
|
||||||
if (FileNode->Flags.DeleteOnClose)
|
if (FileNode->Flags.DeleteOnClose)
|
||||||
FileNode->Flags.DeletePending = TRUE;
|
FileNode->Flags.DeletePending = TRUE;
|
||||||
|
@ -166,7 +166,7 @@ exit:
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspShareCheck(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspShareAccessCheck(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, DWORD GrantedAccess, FSP_FILE_NODE *FileNode)
|
FSP_FSCTL_TRANSACT_REQ *Request, DWORD GrantedAccess, FSP_FILE_NODE *FileNode)
|
||||||
{
|
{
|
||||||
DWORD ShareAccess = Request->Req.Create.ShareAccess;
|
DWORD ShareAccess = Request->Req.Create.ShareAccess;
|
||||||
@ -240,7 +240,7 @@ FSP_API VOID FspFileSystemPostCreateCheck(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
{
|
{
|
||||||
FspFileNodeLock(FileNode);
|
FspFileNodeLock(FileNode);
|
||||||
|
|
||||||
FspShareCheck(FileSystem, Request, GrantedAccess, FileNode);
|
FspShareAccessCheck(FileSystem, Request, GrantedAccess, FileNode);
|
||||||
|
|
||||||
if (Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE)
|
if (Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE)
|
||||||
FileNode->Flags.DeleteOnClose = TRUE;
|
FileNode->Flags.DeleteOnClose = TRUE;
|
||||||
@ -270,7 +270,7 @@ FSP_API NTSTATUS FspFileSystemPostOpenCheck(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result = FspShareCheck(FileSystem, Request, GrantedAccess, FileNode);
|
Result = FspShareAccessCheck(FileSystem, Request, GrantedAccess, FileNode);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
@ -81,6 +81,12 @@ static NTSTATUS FspFsvolCleanup(
|
|||||||
Request->Kind = FspFsctlTransactCleanupKind;
|
Request->Kind = FspFsctlTransactCleanupKind;
|
||||||
Request->Req.Cleanup.UserContext = UserContext;
|
Request->Req.Cleanup.UserContext = UserContext;
|
||||||
Request->Req.Cleanup.UserContext2 = UserContext2;
|
Request->Req.Cleanup.UserContext2 = UserContext2;
|
||||||
|
Request->Req.Cleanup.ReadAccess = !!FileObject->ReadAccess;
|
||||||
|
Request->Req.Cleanup.WriteAccess = !!FileObject->WriteAccess;
|
||||||
|
Request->Req.Cleanup.DeleteAccess = !!FileObject->DeleteAccess;
|
||||||
|
Request->Req.Cleanup.SharedRead = !!FileObject->SharedRead;
|
||||||
|
Request->Req.Cleanup.SharedWrite = !!FileObject->SharedWrite;
|
||||||
|
Request->Req.Cleanup.SharedDelete = !!FileObject->SharedDelete;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note that it is still possible for this request to not be delivered,
|
* Note that it is still possible for this request to not be delivered,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user