HalpIommuGetHardwareDomain

NTSTATUS __stdcall HalpIommuGetHardwareDomain(_LONGLONG a1, INT64 a2, CHAR a3, CHAR a4, _LARGE_INTEGER **a5){
  LONGLONG v5; 
  _LARGE_INTEGER *v9; 
  int DmarptRootAddress; 
  _HALP_ALLOC_CONTEXT *v11; 
  unsigned __int64 v12; 
  _LARGE_INTEGER *v13; 
  UINT8 *v14; 
  INT64 v15; 
  _LARGE_INTEGER **v16; 
  _LARGE_INTEGER v18; 

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

Referenced by:

HalpIommuInitializeDmar
HalpIommuJoinDmaDomain
HalpIommuLeaveDmaDomain