2.1.5.1.2.2 Algorithm to Check Sharing Access to an Existing Stream or Directory
The inputs to the algorithm are:
Open: The Open for an in-progress Open operation to an existing stream or directory.
On completion, the algorithm returns:
Status: An NTSTATUS code that specifies the result of the sharing check.
The object store MUST perform sharing checks when opening an existing stream or directory.
Pseudocode for these checks is as follows:
If AccessCheck(SecurityContext, Open.Link.ParentFile.SecurityDescriptor, FILE_WRITE_DATA) returns FALSE, the object store MUST set Open.SharingMode.FILE_SHARE_READ to TRUE.
If DesiredAccess contains any of (FILE_READ_DATA | FILE_EXECUTE | FILE_WRITE_DATA | FILE_APPEND_DATA | DELETE):
For each ExistingOpen in Open.File.OpenList:
If ExistingOpen.Stream equals Open.Stream and ExistingOpen.GrantedAccess contains any of (FILE_READ_DATA | FILE_EXECUTE | FILE_WRITE_DATA | FILE_APPEND_DATA | DELETE), then return STATUS_SHARING_VIOLATION under any of the following conditions:
If ExistingOpen.SharingMode.FILE_SHARE_READ is FALSE and Open.GrantedAccess contains either FILE_READ_DATA or FILE_EXECUTE
If ExistingOpen.SharingMode.FILE_SHARE_WRITE is FALSE and Open.GrantedAccess contains either FILE_WRITE_DATA or FILE_APPEND_DATA
If ExistingOpen.SharingMode.FILE_SHARE_DELETE is FALSE and Open.GrantedAccess contains DELETE
If Open.SharingMode.FILE_SHARE_READ is FALSE and ExistingOpen.GrantedAccess contains either FILE_READ_DATA or FILE_EXECUTE
If Open.SharingMode.FILE_SHARE_WRITE is FALSE and ExistingOpen.GrantedAccess contains either FILE_WRITE_DATA or FILE_APPEND_DATA
If Open.SharingMode.FILE_SHARE_DELETE is FALSE and ExistingOpen.GrantedAccess contains DELETE
EndIf
EndFor
EndIf
If Open.Stream.Oplock is not empty, the object store MUST check for an oplock break according to the algorithm in section 2.1.4.12, with input values as follows:
Open equal to this operation's Open
Oplock equal to Open.Stream.Oplock
Operation equal to "OPEN"
OpParams containing two members:
DesiredAccess equal to this operation's DesiredAccess
CreateDisposition equal to this operation's CreateDisposition
EndIf
Return STATUS_SUCCESS.