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