diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 9510f2a7..a04df7c7 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -123,6 +123,12 @@ typedef struct { UINT64 UserContext; 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; struct { diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 749f116f..6caa3177 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -189,8 +189,10 @@ FSP_API PGENERIC_MAPPING FspGetFileGenericMapping(VOID); FSP_API NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, 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_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_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllowTraverseCheck, PDWORD PGrantedAccess); FSP_API VOID FspFileSystemPostCreateCheck(FSP_FILE_SYSTEM *FileSystem, diff --git a/src/dll/cleanup.c b/src/dll/cleanup.c index 04155d86..2a8f565c 100644 --- a/src/dll/cleanup.c +++ b/src/dll/cleanup.c @@ -6,6 +6,23 @@ #include +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_FSCTL_TRANSACT_REQ *Request) { @@ -18,6 +35,8 @@ FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem, FspFileNodeLock(FileNode); + FspShareAccessRemove(FileSystem, Request, FileNode); + /* propagate the DeleteOnClose flag to DeletePending */ if (FileNode->Flags.DeleteOnClose) FileNode->Flags.DeletePending = TRUE; diff --git a/src/dll/create.c b/src/dll/create.c index b6fab821..2af7fd3a 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -166,7 +166,7 @@ exit: 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) { DWORD ShareAccess = Request->Req.Create.ShareAccess; @@ -240,7 +240,7 @@ FSP_API VOID FspFileSystemPostCreateCheck(FSP_FILE_SYSTEM *FileSystem, { FspFileNodeLock(FileNode); - FspShareCheck(FileSystem, Request, GrantedAccess, FileNode); + FspShareAccessCheck(FileSystem, Request, GrantedAccess, FileNode); if (Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE) FileNode->Flags.DeleteOnClose = TRUE; @@ -270,7 +270,7 @@ FSP_API NTSTATUS FspFileSystemPostOpenCheck(FSP_FILE_SYSTEM *FileSystem, goto exit; } - Result = FspShareCheck(FileSystem, Request, GrantedAccess, FileNode); + Result = FspShareAccessCheck(FileSystem, Request, GrantedAccess, FileNode); if (!NT_SUCCESS(Result)) goto exit; diff --git a/src/sys/cleanup.c b/src/sys/cleanup.c index eb84eb7c..48c27882 100644 --- a/src/sys/cleanup.c +++ b/src/sys/cleanup.c @@ -81,6 +81,12 @@ static NTSTATUS FspFsvolCleanup( Request->Kind = FspFsctlTransactCleanupKind; Request->Req.Cleanup.UserContext = UserContext; 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,