HalpIommuInitializeDmarPageTable

NTSTATUS __stdcall HalpIommuInitializeDmarPageTable(
        INT64 a1,
        INT64 a2,
        UINT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 result){
  int v7; 
  unsigned int v8; 
  int v9; 
  __int64(__fastcall **v10)(); 
  unsigned int v12; 
  int v13; 
  const char *v14; 
  unsigned int v15; 
  char *v16; 
  char *v17; 
  int v18; 
  unsigned int v19; 
  _DWORD *v20; 
  unsigned int v21; 
  __int64 v22; 
  UINT64 v23; 
  __int64 v24; 

  v7 = a2;
  v8 = a3;
  v9 = a1;
  memset((VOID *)result, 0i64, 0x60u);
  if( v9 )
  {
    if( v9 != 3 )
      return -1073741811;
    v10 = HsaSlPhyPteInterface;
  }
  else
  {
    v10 = IvtSlPhyPteInterface;
  }
  *(_DWORD *)(result + 28) = 3;
  v12 = 0;
  *(_QWORD *)(result + 88) = v10;
  *(_DWORD *)result = v9;
  *(_DWORD *)(result + 24) = v8;
  v13 = 12;
  if( v8 )
  {
    v14 = "\t";
    do
    {
      *(_DWORD *)&v14[result - (_QWORD)"\t" + 36] = *(_DWORD *)v14;
      v15 = v8 - v12++;
      *(_DWORD *)(result + 4i64 * (v15 - 1) + 60) = v13;
      v13 += *(_DWORD *)v14;
      v14 += 4;
    }
    while( v12 < v8 );
  }
  *(_DWORD *)(result + 32) = 0;
  LODWORD(v16) = HalpIommuAllocateAndZeroPageTable(result, 0i64, a6);
  *(_QWORD *)(result + 16) = v16;
  v17 = v16;
  if( v16 )
  {
    v18 = 0;
    v19 = v8 - v7;
    if( v8 == v7 )
    {
LABEL_16:
      *(_QWORD *)(result + 8) = 0i64;
      return 0;
    }
    v20 = (_DWORD *)(result + 36);
    while( 1 )
    {
      v21 = v18 + 1;
      v22 = 1 << *v20 << *(_DWORD *)(result + 28);
      LODWORD(v23) = HalpIommuAllocateAndZeroPageTable(result, (unsigned int)(v18 + 1), a6);
      *(_QWORD *)&v17[v22] = v23;
      if( !v23 )
        break;
      LODWORD(v24) = MmGetPhysicalAddress(v23);
      (**(void(__fastcall ***)(VOID *, _QWORD, __int64))(result + 88))(v17, v8 - v18 - 1, v24);
      if( !byte_140C49BF1 )
        KeInvalidateRangeAllCachesNoIpi(v17, (unsigned int)(1 << *(_DWORD *)(result + 28)));
      v17 = *(char **)&v17[v22];
      ++v20;
      ++v18;
      if( v21 >= v19 )
        goto LABEL_16;
    }
  }
  return -1073741670;
}

Referenced by:

HalpIommuCreateDmarPageTable