IopWaitAndAcquireFileObjectLock

INT64 __stdcall IopWaitAndAcquireFileObjectLock(PVOID Object, INT64 a2){
  UINT8 v2; 
  _BYTE *v3; 
  _BYTE *v4; 
  UINT8 v5; 
  INT8 v6; 
  NTSTATUS v8; 
  _BYTE *v9; 
  UINT64 Flags; 
  void *Thread[5]; 
  INT64 BoostPriority; 
  __int64 v14; 
  v4 = v3;
  v5 = v2;
  v6 = a2;
  _InterlockedIncrement((volatile signed __int32 *)Object + 28);
  do
  {
    if( !*((_DWORD *)Object + 29) && !_InterlockedExchange((volatile __int32 *)Object + 29, 1) )
    {
      if( v4 )
        v4[26] |= 1u;
      ObfReferenceObject(Object);
      _InterlockedDecrement((volatile signed __int32 *)Object + 28);
      return 0;
    }
    if( v4 )
      KeAbPreWait(v4);
    v8 = IopWaitForLockAlertable((char *)Object + 128, v6, v5);
    if( v4 )
    {
      LODWORD(v9) = KeAbPreAcquire((char *)Object + 128, v4, 0i64);
      v4 = v9;
    }
  }
  while( v8 >= 0 );
  _InterlockedDecrement((volatile signed __int32 *)Object + 28);
  if( !*((_DWORD *)Object + 29) && *((_DWORD *)Object + 28) )
  {
    LOBYTE(Flags) = 0;
    LODWORD(BoostPriority) = *((char *)KeGetCurrentThread() + 195);
    KeSetEventBoostPriorityEx(
      (_KEVENT *)((char *)Object + 128),
      (_KTHREAD **)Thread,
      &BoostPriority,
      (char *)Object + 128,
      Flags);
  }
  if( v4 )
    KeAbPostReleaseEx((char *)Object + 128, v4);
  *(_BYTE *)v14 = 1;
  KeLeaveCriticalRegion();
  return(unsigned int)v8;
}

Referenced by:

BuildQueryDirectoryIrp
IoSetInformation
IopCloseFile
IopGetSetSecurityObject
IopQueryXxxInformation
IopSetEaOrQuotaInformationFile
IopXxxControlFile
NtFlushBuffersFileEx
NtLockFile
NtNotifyChangeDirectoryFileEx
NtQueryEaFile
NtQueryInformationFile
NtQueryQuotaInformationFile
NtQueryVolumeInformationFile
NtReadFile
NtReadFileScatter
NtSetEaFile
NtSetInformationFile
NtSetVolumeInformationFile
NtUnlockFile
NtWriteFile
NtWriteFileGather