FsRtlPrivateCheckForSharedLockAccess
VOID __fastcall FsRtlPrivateCheckForSharedLockAccess(_LOCK_QUEUE *LockQueue, _FILE_LOCK_INFO *FileLockInfo){
_RTL_SPLAY_LINKS *v3;
_RTL_SPLAY_LINKS *FirstOverlappingExclusiveNode;
_LARGE_INTEGER EndingByte;
_RTL_SPLAY_LINKS *LastEdgeNode;
LastEdgeNode = 0i64;
v3 = (_RTL_SPLAY_LINKS *)*((_QWORD *)LockQueue + 2);
if( v3 )
{
FirstOverlappingExclusiveNode = FsRtlFindFirstOverlappingExclusiveNode(
v3,
&FileLockInfo->StartingByte,
&FileLockInfo->EndingByte,
&LastEdgeNode,
0i64);
if( FirstOverlappingExclusiveNode )
{
EndingByte = FileLockInfo->EndingByte;
do
{
if( FirstOverlappingExclusiveNode[1].Parent > (_RTL_SPLAY_LINKS *)EndingByte.QuadPart
|| (FirstOverlappingExclusiveNode[2].Parent != (_RTL_SPLAY_LINKS *)FileLockInfo->FileObject
|| FirstOverlappingExclusiveNode[2].LeftChild != FileLockInfo->ProcessId
|| HIDWORD(FirstOverlappingExclusiveNode[1].RightChild) != FileLockInfo->Key)
&& (FileLockInfo->Length.QuadPart || FirstOverlappingExclusiveNode[1].LeftChild) )
{
break;
}
FirstOverlappingExclusiveNode = RtlRealSuccessor(FirstOverlappingExclusiveNode);
}
while( FirstOverlappingExclusiveNode );
}
if( LastEdgeNode )
*((_QWORD *)LockQueue + 2) = RtlSplay(LastEdgeNode);
}
}Referenced by:
FsRtlPrivateCheckWaitingLocks
FsRtlPrivateLock