IvtAttachDeviceDomainInternal

INT64 IvtAttachDeviceDomainInternal(INT64 a1, INT64 a2, INT64 *a3, ...){
  unsigned int *v3; 
  INT64 *p_Routine; 
  char v8; 
  INT64 result; 
  WORK_QUEUE_TYPE v10; 
  void *v11; 
  int v12; 
  unsigned __int8 CurrentIrql; 
  UINT64 v14; 
  INT64 v15; 
  UINT64 v16; 
  INT64 v17; 
  INT64 v18; 
  INT64 v19; 
  INT64 a6; 
  INT64 a6a; 
  INT64 a7; 
  INT64 a8; 
  INT64 a8a; 
  INT64 v25[2]; 
  struct _IO_WORKITEM LockHandle; 
  INT64 a3a; 
  va_list va1; 
  va_list a3b; 
  va_start(va1, a3);
  va_start(a3b, a3);
  a3a = va_arg(va1, _QWORD);
  v3 = *(unsigned int **)(a2 + 32);
  LockHandle.WorkItem.WorkerRoutine = 0i64;
  p_Routine = a3;
  a3a = 0x10000i64;
  v8 = 0;
  result = IvtAllocateContextTable(a1, *v3);
  if( (int)result >= 0 )
  {
    memset((INT64)&LockHandle.Routine, 0i64);
    if( !a3 )
    {
      v12 = *(_DWORD *)(a1 + 260);
      if( v12 == 2 )
      {
        HIDWORD(LockHandle.Routine) = 1;
      }
      else if( v12 != 1 )
      {
        return 3221225473i64;
      }
      p_Routine = (INT64 *)&LockHandle.Routine;
    }
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    LockHandle.WorkItem.List.Flink = 0i64;
    LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)(a1 + 168);
    KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)(a1 + 168), v10, v11);
    if( a3 || IvtGetDomainId(a1, **(unsigned int **)(a2 + 32)) == *(_QWORD *)(a2 + 16) )
    {
      v16 = **(unsigned int **)(a2 + 32);
      if( (*(_DWORD *)(a1 + 184) & 0x1000000) != 0 )
      {
        LODWORD(a7) = 0;
        IvtUpdateExtendedContextEntry(a1, v16, v14, v15, (INT64)p_Routine, a6, a7, (INT64 *)a3b);
      }
      else
      {
        LODWORD(v19) = 0;
        IvtUpdateContextEntry(a1, v16, (INT64)p_Routine, v15, v19, (INT64 *)a3b);
      }
      v8 = 1;
    }
    *(_QWORD *)(a2 + 16) = *((unsigned int *)p_Routine + 6);
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
    __writecr8(CurrentIrql);
    if( v8 )
    {
      v25[1] = (INT64)v25;
      v25[0] = (INT64)v25;
      LODWORD(a8) = 0;
      IvtFlushTbInternal((_QWORD *)a1, v17, a3a, 0, 1, a6, (INT64)v25, a8, 0i64);
      LODWORD(a8a) = 0;
      IvtFlushTbInternal((_QWORD *)a1, v18, *((unsigned int *)p_Routine + 6), 0, 1, a6a, (INT64)v25, a8a, 0i64);
    }
    return 0i64;
  }
  return result;
}

Referenced by:

IvtAttachDeviceDomain
IvtDetachDeviceDomain