IvtIommuSendCommand

__int64 __fastcall IvtIommuSendCommand(_QWORD *a1, _QWORD *a2, int a3){
  unsigned __int8 CurrentIrql; 
  __int64 v6; 
  unsigned __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  unsigned int v10; 
  unsigned int v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 result; 
  int v16[8]; 
  _KLOCK_QUEUE_HANDLE LockQueue[3]; 
  __int64 v18; 

  memset(LockQueue, 0, 24);
  if( a3 == 1 )
  {
    CurrentIrql = 0;
  }
  else
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    LockQueue[0].LockQueue.Next = 0i64;
    LockQueue[0].LockQueue.Lock = a1 + 21;
    KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, a1 + 21);
  }
  v6 = a1[1];
  v7 = *(_QWORD *)(v6 + 136);
  v8 = a1[9];
  v18 = v8;
  v9 = ((unsigned int)(v7 >> 4) & 0x7FFF) + 1;
  v10 = 0;
  v11 = 0;
  v12 = a1[11] >> 4;
  if( (_DWORD)v9 != (_DWORD)v12 )
    v11 = ((v7 >> 4) & 0x7FFF) + 1;
  v13 = v11;
  if( v11 == ((*(_QWORD *)(v6 + 128) >> 4) & 0x7FFFi64) )
  {
    do
    {
      if( (++v10 & dword_140C4A13C) != 0 || !qword_140C4A140 )
        _mm_pause();
      else
        qword_140C4A140(v10, v9, v12);
    }
    while( v13 == ((*(_QWORD *)(v6 + 128) >> 4) & 0x7FFFi64) );
    v8 = v18;
  }
  v14 = 2 * ((v7 >> 4) & 0x7FFF);
  *(_QWORD *)(v8 + 8 * v14) = *a2;
  result = a2[1];
  *(_QWORD *)(v8 + 8 * v14 + 8) = result;
  *(_QWORD *)(v6 + 136) = ((unsigned int)v7 ^ (16 * (_DWORD)v13)) & 0x7FFF0 ^ v7;
  _InterlockedOr(v16, 0);
  if( !a3 )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
    result = CurrentIrql;
    __writecr8(CurrentIrql);
  }
  return result;
}

Referenced by:

IvtInvalidateAllContextEntries
IvtInvalidateContextEntry
IvtInvalidateExtendedContextEntry
IvtInvalidateRemappingTableEntries
IvtIommuWaitCommand