FsRtlFastCheckLockForRead
INT8 __fastcall FsRtlFastCheckLockForRead(INT64 a1, UINT64 *a2, INT64 *a3, INT64 a4, INT64 FileObject, INT64 ProcessId){
_LARGE_INTEGER *v6;
unsigned int v7;
INT64 v9;
_LARGE_INTEGER v10;
_LARGE_INTEGER v11;
INT8 v12;
unsigned __int64 v13;
__int64 v14;
UINT64 *p_QuadPart;
INT8 v16;
INT8 v17;
_LARGE_INTEGER Starting;
_LARGE_INTEGER Ending;
v6 = *(_LARGE_INTEGER **)(a1 + 24);
v7 = a4;
if( !v6 )
return 1;
if( !v6[5].QuadPart )
return 1;
v9 = *a3;
if( !*a3 )
return 1;
v10.QuadPart = *a2;
Starting = v10;
v11.QuadPart = v10.QuadPart + v9 - 1;
Ending = v11;
v12 = 1;
v13 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&v6[3].QuadPart);
if( v11.QuadPart < (unsigned __int64)v6->QuadPart
|| (v14 = *(_QWORD *)(FileObject + 120)) != 0
&& v10.QuadPart >= *(_QWORD *)v14
&& v11.QuadPart <= *(_QWORD *)(v14 + 40)
&& *(_DWORD *)(v14 + 20) == v7
&& *(_QWORD *)(v14 + 32) == ProcessId )
{
KxReleaseSpinLock((UINT64 *)&v6[3].QuadPart);
}
else
{
FsRtlCheckNoExclusiveConflict(
(_LOCK_QUEUE *)&v6[3],
&Starting,
&Ending,
v7,
(_FILE_OBJECT *)FileObject,
(VOID *)ProcessId);
p_QuadPart = (UINT64 *)&v6[3].QuadPart;
v17 = v16;
KxReleaseSpinLock(p_QuadPart);
v12 = v17;
}
__writecr8(v13);
return v12;
}Referenced by:
FsRtlCheckLockForReadAccess