HalpIommuGetHardwareDomain

INT64 __fastcall HalpIommuGetHardwareDomain(LONGLONG a1, INT64 a2, CHAR a3, CHAR a4, LARGE_INTEGER **a5){
  LARGE_INTEGER *v9; 
  int DmarptRootAddress; 
  __int64 v11; 
  unsigned __int8 v12; 
  unsigned __int64 v13; 
  LARGE_INTEGER *v14; 
  __int64 v15; 
  INT64 v16; 
  LARGE_INTEGER **v17; 
  LARGE_INTEGER v19; 
  v19.QuadPart = 0i64;
  v9 = 0i64;
  DmarptRootAddress = 0;
  KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 16), a2);
  v13 = v12;
  v14 = *(LARGE_INTEGER **)a1;
  if( *(_QWORD *)a1 != a1 )
  {
    do
    {
      v9 = v14;
      if( v14[3].QuadPart == a2 )
        break;
      v14 = (LARGE_INTEGER *)v14->QuadPart;
    }
    while( v14 != (LARGE_INTEGER *)a1 );
    if( v14 != (LARGE_INTEGER *)a1 )
    {
      if( a1 != HalpIommuBypassDomain && a4 )
        ++v9[2].QuadPart;
      goto LABEL_18;
    }
  }
  if( !a3 )
    goto LABEL_18;
  v15 = HalpMmAllocCtxAlloc(v11, 112i64);
  v9 = (LARGE_INTEGER *)v15;
  if( !v15 )
  {
    DmarptRootAddress = -1073741670;
    goto LABEL_21;
  }
  memset(v15, 0i64);
  v9[3].QuadPart = a2;
  v9[2].QuadPart = 1i64;
  v9[4].LowPart = 1;
  v16 = *(_QWORD *)(a1 + 24);
  if( v16 )
  {
    DmarptRootAddress = HalpIommuGetDmarptRootAddress(v16, ((*(_DWORD *)(a2 + 456) >> 12) & 7u) + 1, &v19);
    if( DmarptRootAddress < 0 )
      goto LABEL_19;
    v9[6] = v19;
  }
  v9[4].HighPart = *(_DWORD *)(a1 + 36);
  DmarptRootAddress = HalpIommuAcquireNewDomain(a2, (INT64)&v9[4]);
  if( DmarptRootAddress >= 0 )
  {
    v17 = *(LARGE_INTEGER ***)(a1 + 8);
    if( *v17 != (LARGE_INTEGER *)a1 )
      __fastfail(3u);
    v9->QuadPart = a1;
    v9[1].QuadPart = (LONGLONG)v17;
    *v17 = v9;
    *(_QWORD *)(a1 + 8) = v9;
LABEL_18:
    *a5 = v9;
    if( DmarptRootAddress >= 0 )
      goto LABEL_21;
  }
LABEL_19:
  if( v9 )
    HalpMmAllocCtxFree(v11, (__int64)v9);
LABEL_21:
  KxReleaseSpinLock((UINT64 *)(a1 + 16));
  __writecr8(v13);
  return(unsigned int)DmarptRootAddress;
}

Referenced by:

HalpIommuInitializeDmar
HalpIommuJoinDmaDomain
HalpIommuLeaveDmaDomain