HalpDmaAllocateLocalScatterPool

__int64 __fastcall HalpDmaAllocateLocalScatterPool(PHYSICAL_ADDRESS *a1, unsigned int a2){
  __int64 v4; 
  PMDL v5; 
  __int64 v6; 
  _DWORD *v7; 
  ULONG v8; 
  __int64 v9; 
  __int64 v10; 
  PVOID v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 ScatterPagesFromScatterPool; 
  __int64 v16; 
  int v17; 
  __int64 v18; 
  __int64 v19; 
  int v20; 
  __int64 ScatterPagesFromContiguousPool; 
  int v22; 
  __int64 v23; 
  __int64 v24; 
  int v25; 
  __int64 result; 
  PVOID BaseAddress; 
  int v28; 
  BaseAddress = 0i64;
  v28 = 0;
  v4 = 0i64;
  v5 = HalpDmaAllocateScatterMemory(a1, a2, &BaseAddress);
  v7 = v5;
  if( v5 )
  {
    v8 = v5->ByteCount >> 12;
    v9 = HalpMmAllocCtxAlloc(v6, 24i64);
    v11 = BaseAddress;
    v12 = v9;
    if( v9 )
    {
      v13 = HalpMmAllocCtxAlloc(v10, 72i64 * v8);
      v4 = v13;
      if( v13 )
      {
        *(_QWORD *)v12 = 0i64;
        *(_DWORD *)(v12 + 12) = 0;
        memset(v13, 0i64);
        *(_DWORD *)(v12 + 8) = v8;
        *(_QWORD *)(v12 + 16) = v4;
        a1[10].LowPart = 0;
        a1[6].QuadPart = v12;
        a1[9].QuadPart = v12;
        v4 = (__int64)HalpDmaCommitScatterMapBuffers((__int64)a1, (__int64)v11, 0i64, 0, v7);
        if( v4 )
        {
          a1[40].QuadPart = (LONGLONG)v7;
          a1[41].QuadPart = (LONGLONG)v11;
          goto LABEL_11;
        }
        HalpMmAllocCtxFree(v6, *(_QWORD *)(a1[6].QuadPart + 16));
      }
      HalpMmAllocCtxFree(v14, v12);
    }
    if( v11 )
      MmUnmapLockedPages(v11, (PMDL)v7);
    MmFreePagesFromMdl((MDL *)v7);
    ExFreePoolWithTag(v7, 0);
    a1[6].QuadPart = 0i64;
  }
  v8 = 0;
LABEL_11:
  if( v8 != a2 )
  {
    ScatterPagesFromScatterPool = HalpDmaAllocateScatterPagesFromScatterPool(
                                    v6,
                                    a1[19].QuadPart,
                                    a2 - v8,
                                    0i64,
                                    1,
                                    (unsigned int *)&v28);
    if( ScatterPagesFromScatterPool )
    {
      v17 = v28;
      v18 = ScatterPagesFromScatterPool;
      if( v28 )
      {
        v19 = (unsigned int)v28;
        do
        {
          *(_QWORD *)(v18 + 48) = *(_QWORD *)(v18 + 48) & 0xFFFFFFFFFFFFFFF3ui64 | 8;
          v18 = *(_QWORD *)(v18 + 8);
          --v19;
        }
        while( v19 );
      }
      v4 = HalpDmaPrependTranslations(ScatterPagesFromScatterPool, v17, v4);
      v8 += v20;
    }
    if( v8 != a2 )
    {
      ScatterPagesFromContiguousPool = HalpDmaAllocateScatterPagesFromContiguousPool(
                                         v16,
                                         a1[19].QuadPart,
                                         a2 - v8,
                                         0i64,
                                         1,
                                         (ULONG *)&v28);
      if( ScatterPagesFromContiguousPool )
      {
        v22 = v28;
        v23 = ScatterPagesFromContiguousPool;
        if( v28 )
        {
          v24 = (unsigned int)v28;
          do
          {
            *(_QWORD *)(v23 + 48) = *(_QWORD *)(v23 + 48) & 0xFFFFFFFFFFFFFFF3ui64 | 8;
            v23 = *(_QWORD *)(v23 + 8);
            --v24;
          }
          while( v24 );
        }
        v4 = HalpDmaPrependTranslations(ScatterPagesFromContiguousPool, v22, v4);
        v8 += v25;
      }
      if( !v8 )
        return 3221225626i64;
    }
  }
  a1[28].LowPart = a2;
  result = 0i64;
  a1[3].QuadPart = v4;
  a1[4].LowPart = v8;
  return result;
}

Referenced by:

HalpDmaAllocateChildAdapterV2
HalpDmaAllocateChildAdapterV3