HalpIommuAllocateDmaDomain

INT64 __fastcall HalpIommuAllocateDmaDomain(INT64 a1, CHAR a2, INT64 *a3){
  int PageTableType; 
  unsigned int v6; 
  __int64 v7; 
  __int64 v8; 
  INT64 v9; 
  bool v10; 
  signed __int32 v12; 
  INT64 v13; 
  INT64 v14; 
  signed __int32 v15; 
  int v16; 
  INT64 v17; 
  LODWORD(v17) = 0;
  PageTableType = 0;
  v6 = a1;
  v7 = HalpMmAllocCtxAlloc(a1, 48i64);
  v9 = v7;
  if( !v7 )
    return(unsigned int)-1073741670;
  v10 = HalpHvIommu == 0;
  *(_OWORD *)v7 = 0i64;
  *(_OWORD *)(v7 + 16) = 0i64;
  *(_OWORD *)(v7 + 32) = 0i64;
  *(_BYTE *)(v7 + 44) = a2;
  if( !v10 )
  {
    if( a2 )
    {
      if( !HalpHvIommuDeviceDomain )
        goto LABEL_13;
    }
    else if( !HalpHvParaVirtIommuDomain )
    {
      goto LABEL_13;
    }
    v12 = _InterlockedIncrement(&HalpIommuDomainId);
    *(_DWORD *)(v7 + 32) = v12;
    v16 = 0;
    *(_BYTE *)(v7 + 40) = a2 == 0;
    v15 = v12;
    LOBYTE(v16) = a2 == 0;
    PageTableType = ((__int64(__fastcall *)(signed __int32 *))qword_140C4A2B0)(&v15);
    goto LABEL_6;
  }
  if( !a2 )
  {
LABEL_13:
    PageTableType = -1073741637;
    goto LABEL_16;
  }
  if( v6 > 1 )
  {
    PageTableType = HalpIommuGetPageTableType(&v17);
    if( PageTableType < 0 )
      goto LABEL_16;
    PageTableType = HalpIommuCreateDmarPageTable(
                      (unsigned int)v17,
                      (unsigned int)HalpIommuMinPageTableDepth,
                      (unsigned int)HalpIommuMaxPageTableDepth,
                      v13,
                      v14,
                      0i64,
                      (INT64 *)(v9 + 24));
    if( PageTableType < 0 )
      goto LABEL_16;
  }
  *(_QWORD *)(v9 + 8) = v9;
  *(_QWORD *)v9 = v9;
  *(_QWORD *)(v9 + 16) = 0i64;
LABEL_6:
  *(_DWORD *)(v9 + 36) = v6;
  *a3 = v9;
  if( PageTableType < 0 )
LABEL_16:
    HalpMmAllocCtxFree(v8, v9);
  return(unsigned int)PageTableType;
}

Referenced by:

HalpIommuInitializeDmar
IommuDomainCreate