ViKeWaitForMultipleObjectsCommon

NTSTATUS __stdcall ViKeWaitForMultipleObjectsCommon(
        UINT64 Count,
        VOID **Object,
        _WAIT_TYPE WaitType,
        _KWAIT_REASON WaitReason,
        CHAR WaitMode,
        UINT8 Alertable,
        _LARGE_INTEGER *Timeout,
        _KWAIT_BLOCK *WaitBlockArray,
        UINT64 DisableChecks){
  _ETHREAD *CurrentThread; 
  unsigned int v13; 
  UINT8 CurrentIrql; 
  UINT64 EnableStackSwap; 
  int EnableStackSwapa; 
  int WaitIrql; 
  UINT64 v19; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v13 = Count;
  if( (CurrentThread->Tcb._bf_0 & 4) != 0 )
    CurrentIrql = CurrentThread->Tcb.WaitIrql;
  else
    CurrentIrql = KeGetCurrentIrql();
  LODWORD(EnableStackSwap) = ((unsigned int)*(&CurrentThread->Tcb.MiscFlags + 1) >> 6) & 1;
  ViKeWaitSanityChecks(Count, Object, WaitMode, Timeout, EnableStackSwap, CurrentIrql, v19);
  if( (unsigned int)ViKeInjectStatusAlerted(Alertable) )
    return 257;
  LOBYTE(WaitIrql) = Alertable;
  LOBYTE(EnableStackSwapa) = WaitMode;
  return((__int64(__fastcall *)(_QWORD, VOID **, _QWORD, _QWORD, int, int, _LARGE_INTEGER *, _KWAIT_BLOCK *))pXdvKeWaitForMultipleObjects)(
           v13,
           Object,
           (unsigned int)WaitType,
           (unsigned int)WaitReason,
           EnableStackSwapa,
           WaitIrql,
           Timeout,
           WaitBlockArray);
}

Referenced by:

VerifierKeWaitForMultipleObjects
VerifierKeWaitForMultipleObjectsNoReboot