ExBlockOnAddressPushLock

NTSTATUS __stdcall ExBlockOnAddressPushLock(
        _EX_PUSH_LOCK *PushLock,
        VOID *Address,
        VOID *CompareAddress,
        UINT64 AddressSize,
        _LARGE_INTEGER *Timeout){
  int v9; 
  bool v10; 
  int v12; 
  int v13; 
  _EX_PUSH_LOCK_WAIT_BLOCK WaitBlock[16]; 

  memset(WaitBlock, 0i64, sizeof(WaitBlock));
  ExBlockPushLock(PushLock, WaitBlock);
  if( AddressSize > 8 )
    goto LABEL_10;
  v9 = AddressSize - 1;
  if( v9 )
  {
    v12 = v9 - 1;
    if( v12 )
    {
      v13 = v12 - 2;
      if( v13 )
      {
        if( v13 != 4 )
          goto LABEL_10;
        v10 = *(_QWORD *)Address == *(_QWORD *)CompareAddress;
      }
      else
      {
        v10 = *(_DWORD *)Address == *(_DWORD *)CompareAddress;
      }
    }
    else
    {
      v10 = *(_WORD *)Address == *(_WORD *)CompareAddress;
    }
  }
  else
  {
    v10 = *(_BYTE *)Address == *(_BYTE *)CompareAddress;
  }
  if( v10 )
    return ExTimedWaitForUnblockPushLock(PushLock, WaitBlock, Timeout);
LABEL_10:
  ExpUnblockPushLock(PushLock, WaitBlock, 0);
  return 0;
}

Referenced by:

CmLoadAppKey
CmShutdownSystem
CmUnRegisterCallback
CmpRollbackLightWeightTransaction
CmpTransSearchAddTrans
CmpWaitForLateUnloadWorker
ExpBlockOnLockedHandleEntry
MiLockImageSection
PopBatteryUpdateCurrentState
PsSetVmProcessorHostProcess
RtlUpdateSwapReference
RtlpCSparseBitmapWaitOnAddress