FsRtlFastCheckLockForWrite

INT8 __fastcall FsRtlFastCheckLockForWrite(){
  _LARGE_INTEGER *v0; 
  __int64 v1; 
  __int64 *v2; 
  int v3; 
  _LARGE_INTEGER *v4; 
  __int64 v5; 
  _LARGE_INTEGER v6; 
  _LOCK_QUEUE *v7; 
  _LARGE_INTEGER v8; 
  INT8 v9; 
  unsigned __int64 v10; 
  _FILE_OBJECT *v12; 
  VOID *v13; 
  __int64 v14; 
  bool v15; 
  unsigned int v16; 
  UINT8 v17; 
  UINT8 v18; 
  _LARGE_INTEGER Starting; 
  _LARGE_INTEGER Ending; 
  UINT64 Key; 
  PVOID FileObject; 
  PVOID ProcessId; 

  LODWORD(Key) = v3;
  v4 = *(_LARGE_INTEGER **)(v1 + 24);
  if( v4 && (v4[4].QuadPart || v4[5].QuadPart) )
  {
    v5 = *v2;
    if( *v2 )
    {
      v6 = *v0;
      v7 = (_LOCK_QUEUE *)&v4[3];
      Starting = v6;
      v8.QuadPart = v6.QuadPart + v5 - 1;
      Ending = v8;
      v9 = 1;
      v10 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&v4[3].QuadPart);
      if( v8.QuadPart < (unsigned __int64)v4->QuadPart )
      {
LABEL_5:
        KxReleaseSpinLock((UINT64 *)&v4[3].QuadPart);
LABEL_6:
        __writecr8(v10);
        return v9;
      }
      v12 = (_FILE_OBJECT *)FileObject;
      v13 = ProcessId;
      v14 = *((_QWORD *)FileObject + 15);
      if( v14 )
      {
        v15 = v6.QuadPart < *(_QWORD *)v14;
        v16 = Key;
        if( !v15
          && v8.QuadPart <= *(_QWORD *)(v14 + 40)
          && *(_DWORD *)(v14 + 20) == (_DWORD)Key
          && *(PVOID *)(v14 + 32) == ProcessId
          && *(_BYTE *)(v14 + 16) )
        {
          goto LABEL_5;
        }
      }
      else
      {
        v16 = Key;
      }
      v17 = FsRtlCheckNoSharedConflict((_LOCK_QUEUE *)&v4[3], &Starting, &Ending);
      if( v17 == 1 )
      {
        FsRtlCheckNoExclusiveConflict(v7, &Starting, &Ending, v16, v12, v13);
        v17 = v18;
      }
      KxReleaseSpinLock((UINT64 *)v7);
      v9 = v17;
      goto LABEL_6;
    }
  }
  return 1;
}

Referenced by:

FsRtlCheckLockForWriteAccess