HalpIommuAllocateDmaDomain

NTSTATUS __stdcall HalpIommuAllocateDmaDomain(INT64 a1, CHAR a2, INT64 *a3){
  int PageTableType; 
  unsigned int v6; 
  UINT8 *v7; 
  _HALP_ALLOC_CONTEXT *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((_HALP_ALLOC_CONTEXT *)a1, 0x30ui64);
  v9 = (INT64 *)v7;
  if( !v7 )
    return -1073741670;
  v10 = byte_140C49B2C == 0;
  *(_OWORD *)v7 = 0i64;
  *((_OWORD *)v7 + 1) = 0i64;
  *((_OWORD *)v7 + 2) = 0i64;
  v7[44] = a2;
  if( !v10 )
  {
    if( a2 )
    {
      if( !byte_140C49B2E )
        goto LABEL_13;
    }
    else if( !byte_140C49B2D )
    {
      goto LABEL_13;
    }
    v12 = _InterlockedIncrement(&HalpIommuDomainId);
    *((_DWORD *)v7 + 8) = v12;
    v16 = 0;
    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,
                      HIDWORD(qword_140C49BE8),
                      (unsigned int)qword_140C49BE8,
                      v13,
                      v14,
                      0i64,
                      v9 + 3);
    if( PageTableType < 0 )
      goto LABEL_16;
  }
  v9[1] = (INT64)v9;
  *v9 = (INT64)v9;
  v9[2] = 0i64;
LABEL_6:
  *((_DWORD *)v9 + 9) = v6;
  *a3 = (INT64)v9;
  if( PageTableType < 0 )
LABEL_16:
    HalpMmAllocCtxFree(v8, v9);
  return PageTableType;
}

Referenced by:

HalpIommuInitializeDmar
IommuDomainCreate