ViKeWaitForSingleObjectCommon

INT64 __stdcall ViKeWaitForSingleObjectCommon(
        PVOID Object,
        _KWAIT_REASON WaitReason,
        CHAR WaitMode,
        UINT8 Alertable,
        _LARGE_INTEGER *Timeout,
        UINT64 DisableChecks){
  _ETHREAD *CurrentThread; 
  UINT8 WaitIrql; 
  _LARGE_INTEGER *v11; 
  __int64 v12; 
  __int64 v13; 
  UINT64 EnableStackSwap; 
  UINT64 v16; 
  VOID *Objecta; 
  Objecta = Object;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (*((_DWORD *)CurrentThread + 29) & 4) != 0 )
    WaitIrql = *((_BYTE *)CurrentThread + 390);
  else
    WaitIrql = KeGetCurrentIrql();
  v11 = Timeout;
  LODWORD(EnableStackSwap) = (*((_DWORD *)CurrentThread + 30) >> 6) & 1;
  ViKeWaitSanityChecks(1ui64, &Objecta, WaitMode, Timeout, EnableStackSwap, WaitIrql, v16);
  if( (unsigned int)ViKeInjectStatusAlerted(Alertable) )
    return 257i64;
  LOBYTE(v13) = Alertable;
  LOBYTE(v12) = WaitMode;
  return((__int64(__fastcall *)(VOID *, _QWORD, __int64, __int64, _LARGE_INTEGER *))pXdvKeWaitForSingleObject)(
           Objecta,
           (unsigned int)WaitReason,
           v12,
           v13,
           v11);
}

Referenced by:

VerifierKeWaitForSingleObject
VerifierKeWaitForSingleObjectNoReboot