IvtIommuWaitCommand

NTSTATUS __stdcall IvtIommuWaitCommand(INT64 a1, INT64 a2, UINT8 *a3){
  int v3; 
  unsigned __int8 CurrentIrql; 
  __int64 v6; 
  __int64 v7; 
  unsigned int v8; 
  NTSTATUS result; 
  __int64 v10[2]; 
  _KLOCK_QUEUE_HANDLE LockQueue; 

  v3 = (int)a3;
  memset(&LockQueue, 0, sizeof(LockQueue));
  if( (_DWORD)a3 )
  {
    CurrentIrql = 0;
  }
  else
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    LockQueue.LockQueue.Next = 0i64;
    LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 168);
    KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 168));
  }
  v10[0] = *(_QWORD *)(a1 + 152);
  v10[1] = *(_QWORD *)(a1 + 160);
  *(_DWORD *)(a1 + 136) = 1;
  IvtIommuSendCommand((_QWORD *)a1, v10, 1);
  v8 = 0;
  while( 1 )
  {
    result = *(_DWORD *)(a1 + 136);
    if( !result )
      break;
    if( (++v8 & dword_140C4A13C) != 0 || !qword_140C4A140 )
      _mm_pause();
    else
      qword_140C4A140(v8, v6, v7);
  }
  if( !v3 )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
    result = CurrentIrql;
    __writecr8(CurrentIrql);
  }
  return result;
}

Referenced by:

IvtInvalidateAllContextEntries
IvtInvalidateContextEntry
IvtInvalidateExtendedContextEntry
IvtInvalidateRemappingTableEntries