mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-24 01:13:04 -05:00
dll: FspShareCheck
This commit is contained in:
parent
6f5a290a81
commit
f2f9e9f94b
@ -121,5 +121,53 @@ exit:
|
|||||||
FSP_API NTSTATUS FspShareCheck(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspShareCheck(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode)
|
||||||
{
|
{
|
||||||
|
DWORD DesiredAccess = Request->Req.Create.DesiredAccess;
|
||||||
|
DWORD ShareAccess = Request->Req.Create.ShareAccess;
|
||||||
|
BOOLEAN ReadAccess, WriteAccess, DeleteAccess;
|
||||||
|
BOOLEAN SharedRead, SharedWrite, SharedDelete;
|
||||||
|
ULONG OpenCount;
|
||||||
|
|
||||||
|
ReadAccess = 0 != (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
|
||||||
|
WriteAccess = 0 != (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA));
|
||||||
|
DeleteAccess = 0 != (DesiredAccess & DELETE);
|
||||||
|
|
||||||
|
if (ReadAccess || WriteAccess || DeleteAccess)
|
||||||
|
{
|
||||||
|
SharedRead = 0 != (ShareAccess & FILE_SHARE_READ);
|
||||||
|
SharedWrite = 0 != (ShareAccess & FILE_SHARE_WRITE);
|
||||||
|
SharedDelete = 0 != (ShareAccess & FILE_SHARE_DELETE);
|
||||||
|
|
||||||
|
OpenCount = FileNode->ShareAccess.OpenCount;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IF ReadAccess AND there are already some exclusive readers
|
||||||
|
* OR WriteAccess AND there are already some exclusive writers
|
||||||
|
* OR DeleteAccess AND there are already some exclusive deleters
|
||||||
|
* OR exclusive read requested AND there are already some readers
|
||||||
|
* OR exclusive write requested AND there are already some writers
|
||||||
|
* OR exclusive delete requested AND there are already some deleters
|
||||||
|
*/
|
||||||
|
if (ReadAccess && (FileNode->ShareAccess.SharedRead < OpenCount))
|
||||||
|
return STATUS_SHARING_VIOLATION;
|
||||||
|
if (WriteAccess && (FileNode->ShareAccess.SharedWrite < OpenCount))
|
||||||
|
return STATUS_SHARING_VIOLATION;
|
||||||
|
if (DeleteAccess && (FileNode->ShareAccess.SharedDelete < OpenCount))
|
||||||
|
return STATUS_SHARING_VIOLATION;
|
||||||
|
if (!SharedRead && 0 != FileNode->ShareAccess.Readers)
|
||||||
|
return STATUS_SHARING_VIOLATION;
|
||||||
|
if (!SharedWrite && 0 != FileNode->ShareAccess.Writers)
|
||||||
|
return STATUS_SHARING_VIOLATION;
|
||||||
|
if (!SharedDelete && 0 != FileNode->ShareAccess.Deleters)
|
||||||
|
return STATUS_SHARING_VIOLATION;
|
||||||
|
|
||||||
|
FileNode->ShareAccess.OpenCount++;
|
||||||
|
FileNode->ShareAccess.Readers += ReadAccess;
|
||||||
|
FileNode->ShareAccess.Writers += WriteAccess;
|
||||||
|
FileNode->ShareAccess.Deleters += DeleteAccess;
|
||||||
|
FileNode->ShareAccess.SharedRead += SharedRead;
|
||||||
|
FileNode->ShareAccess.SharedWrite += SharedWrite;
|
||||||
|
FileNode->ShareAccess.SharedDelete += SharedDelete;
|
||||||
|
}
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user