IvtAttachDeviceDomainInternal

NTSTATUS IvtAttachDeviceDomainInternal(INT64 a1, __int64 a2, int *a3, ...){
  unsigned int *v3; 
  int *v5; 
  char v8; 
  NTSTATUS result; 
  int v10; 
  unsigned __int8 CurrentIrql; 
  UINT64 v12; 
  INT64 v13; 
  __int64 v14; 
  UINT64 v15; 
  INT64 v16; 
  INT64 v17; 
  INT64 v18; 
  INT64 v19; 
  INT64 v20; 
  INT64 v21; 
  INT64 v22; 
  INT64 v23; 
  INT64 v24[2]; 
  _KLOCK_QUEUE_HANDLE LockQueue; 
  int v26[20]; 
  INT64 v27; 
  va_list va; 
  va_list va1; 

  va_start(va1, a3);
  va_start(va, a3);
  v27 = va_arg(va1, _QWORD);
  v3 = *(unsigned int **)(a2 + 32);
  *(_QWORD *)&LockQueue.OldIrql = 0i64;
  v5 = a3;
  v27 = 0x10000i64;
  v8 = 0;
  result = IvtAllocateContextTable(a1, *v3);
  if( result >= 0 )
  {
    memset(v26, 0i64, sizeof(v26));
    if( !a3 )
    {
      v10 = *(_DWORD *)(a1 + 260);
      if( v10 == 2 )
      {
        v26[1] = 1;
      }
      else if( v10 != 1 )
      {
        return -1073741823;
      }
      v5 = v26;
    }
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    LockQueue.LockQueue.Next = 0i64;
    LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 168);
    KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 168));
    if( a3 || (LODWORD(v14) = IvtGetDomainId(a1, **(unsigned int **)(a2 + 32)), v14 == *(_QWORD *)(a2 + 16)) )
    {
      v15 = **(unsigned int **)(a2 + 32);
      if( (*(_DWORD *)(a1 + 184) & 0x1000000) != 0 )
      {
        LODWORD(v21) = 0;
        IvtUpdateExtendedContextEntry(a1, v15, v12, v13, (INT64)v5, v19, v21, (INT64 *)va);
      }
      else
      {
        LODWORD(v18) = 0;
        IvtUpdateContextEntry(a1, v15, (INT64)v5, v13, v18, (INT64 *)va);
      }
      v8 = 1;
    }
    *(_QWORD *)(a2 + 16) = (unsigned int)v5[6];
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
    __writecr8(CurrentIrql);
    if( v8 )
    {
      v24[1] = (INT64)v24;
      v24[0] = (INT64)v24;
      LODWORD(v22) = 0;
      IvtFlushTbInternal(a1, v16, v27, 0i64, 1, v19, (INT64)v24, v22, 0i64);
      LODWORD(v23) = 0;
      IvtFlushTbInternal(a1, v17, (unsigned int)v5[6], 0i64, 1, v20, (INT64)v24, v23, 0i64);
    }
    return 0;
  }
  return result;
}

Referenced by:

IvtAttachDeviceDomain
IvtDetachDeviceDomain