HalpDmaAllocateNewTranslationBuffer

__int64 __fastcall HalpDmaAllocateNewTranslationBuffer(__int64 a1, unsigned int a2){
  __int64 v3; 
  __int64 v4; 
  __int64 v5; 
  __int64 v6; 
  char v7; 
  unsigned int v8; 
  unsigned int v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  unsigned int v13; 
  _QWORD *v14; 
  _LARGE_INTEGER *v15; 
  _LARGE_INTEGER v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  unsigned int v19; 
  __int64 v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  unsigned int v24; 
  _LARGE_INTEGER *v25; 
  v24 = 0;
  v3 = a1;
  if( !*(_BYTE *)(a1 + 144) )
    v3 = *(_QWORD *)(a1 + 152);
  v5 = HalpMmAllocCtxAlloc(a1, 24i64);
  if( v5 )
  {
    v7 = 1;
    v8 = 72 * a2;
    if( 72 * a2 >= 0x1000 )
      v9 = (v8 + 4095) & 0xFFFFF000;
    else
      v9 = 4096;
    v10 = v9;
    v11 = HalpMmAllocCtxAlloc(v4, v9);
    if( v11 || v8 < 0x1000 && (v10 = v8, (v11 = HalpMmAllocCtxAlloc(v4, v8)) != 0) )
    {
      *(_QWORD *)(v5 + 16) = v11;
      *(_QWORD *)v5 = 0i64;
      *(_DWORD *)(v5 + 8) = v10 / 0x48;
      return v5;
    }
  }
  else
  {
    v7 = 0;
  }
  v12 = 0i64;
  v25 = 0i64;
  v13 = 0;
  v14 = 0i64;
  while( a2 )
  {
    LOBYTE(v6) = 1;
    v15 = (_LARGE_INTEGER *)HalpDmaAllocateScatterPagesFromScatterPool(v4, v3, 1i64, v6, 0, &v24);
    if( !v15 )
    {
      LOBYTE(v6) = 1;
      v15 = (_LARGE_INTEGER *)HalpDmaAllocateScatterPagesFromContiguousPool(v4, v3, 1i64, v6, 0, &v24);
      if( !v15 )
      {
LABEL_31:
        if( v13 )
        {
          v20 = v13;
          do
          {
            v21 = *(_QWORD *)(v12 + 48);
            if( (v21 & 0x10) != 0 )
            {
              MmUnmapIoSpace((PVOID)(v21 & 0xFFFFFFFFFFFFF000ui64), 0x1000ui64);
              *(_QWORD *)(v12 + 48) = *(_DWORD *)(v12 + 48) & 0xFEF;
            }
            v22 = *(_QWORD *)(v12 + 8);
            HalpDmaReturnPageToOwner(0i64, v3, v12);
            v12 = v22;
            --v20;
          }
          while( v20 );
        }
        if( v7 )
          HalpMmAllocCtxFree(v4, v5);
        return 0i64;
      }
    }
    if( v12 )
      v25[1].QuadPart = (LONGLONG)v15;
    else
      v12 = (unsigned __int64)v15;
    v16 = v15[6];
    ++v13;
    v25 = v15;
    v17 = v16.QuadPart & 0xFFFFFFFFFFFFF000ui64;
    if( !v17 )
    {
      MmMapIoSpaceEx(*v15, 0x1000ui64, 4ui64);
      v17 = v18;
      if( !v18 )
        goto LABEL_31;
      v15[6].QuadPart |= 0x10ui64;
      v4 = v18 | v15[6].LowPart & 0xFFF;
      v15[6].QuadPart = v4;
    }
    if( v13 == 1 && v7 )
    {
      *(_QWORD *)v5 = 0i64;
      v14 = (_QWORD *)v5;
      *(_QWORD *)(v5 + 16) = v17;
      *(_DWORD *)(v5 + 8) = 56;
    }
    else
    {
      if( v5 )
        *v14 = v17;
      else
        v5 = v17;
      *(_QWORD *)v17 = 0i64;
      *(_QWORD *)(v17 + 16) = v17 + 24;
      v14 = (_QWORD *)v17;
      *(_DWORD *)(v17 + 8) = 56;
    }
    v19 = a2;
    a2 -= 56;
    if( v19 <= 0x38 )
      a2 = 0;
  }
  return v5;
}

Referenced by:

HalpDmaGetTranslationEntries