IvtIommuSendCommand

INT64 __fastcall IvtIommuSendCommand(_QWORD *a1, _QWORD *a2, INT64 a3){
  void *v3; 
  int v5; 
  unsigned __int8 CurrentIrql; 
  __int64 v7; 
  unsigned __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  unsigned int v11; 
  unsigned int v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  INT64 result; 
  int v17[8]; 
  struct _IO_WORKITEM LockHandle; 
  __int64 v19; 
  v5 = a3;
  memset(&LockHandle, 0, 24);
  if( (_DWORD)a3 == 1 )
  {
    CurrentIrql = 0;
  }
  else
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    LockHandle.WorkItem.List.Flink = 0i64;
    LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)(a1 + 21);
    KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)(a1 + 21), (WORK_QUEUE_TYPE)a3, v3);
  }
  v7 = a1[1];
  v8 = *(_QWORD *)(v7 + 136);
  v9 = a1[9];
  v19 = v9;
  v10 = ((unsigned int)(v8 >> 4) & 0x7FFF) + 1;
  v11 = 0;
  v12 = 0;
  v13 = a1[11] >> 4;
  if( (_DWORD)v10 != (_DWORD)v13 )
    v12 = ((v8 >> 4) & 0x7FFF) + 1;
  v14 = v12;
  if( v12 == ((*(_QWORD *)(v7 + 128) >> 4) & 0x7FFFi64) )
  {
    do
    {
      if( (++v11 & dword_140C4A13C) != 0 || !qword_140C4A140 )
        _mm_pause();
      else
        qword_140C4A140(v11, v10, v13);
    }
    while( v14 == ((*(_QWORD *)(v7 + 128) >> 4) & 0x7FFFi64) );
    v9 = v19;
  }
  v15 = 2 * ((v8 >> 4) & 0x7FFF);
  *(_QWORD *)(v9 + 8 * v15) = *a2;
  result = a2[1];
  *(_QWORD *)(v9 + 8 * v15 + 8) = result;
  *(_QWORD *)(v7 + 136) = ((unsigned int)v8 ^ (16 * (_DWORD)v14)) & 0x7FFF0 ^ v8;
  _InterlockedOr(v17, 0);
  if( !v5 )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
    result = CurrentIrql;
    __writecr8(CurrentIrql);
  }
  return result;
}

Referenced by:

IvtFlushTbInternal
IvtInvalidateAllContextEntries
IvtInvalidateContextEntry
IvtInvalidateExtendedContextEntry
IvtInvalidateRemappingTableEntries
IvtIommuWaitCommand