HalpDmaAllocateLocalContiguousPool

__int64 __fastcall HalpDmaAllocateLocalContiguousPool(__int64 a1, unsigned int a2){
  unsigned int v2; 
  unsigned int v3; 
  RTL_BITMAP *v5; 
  RTL_BITMAP *v6; 
  char v8; 
  __int64 v9; 
  __int64 v10; 
  bool v11; 
  int v12; 
  __int64 v13; 
  __int64 v14; 
  PVOID v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned __int64 QuadPart; 
  __int64 v21; 
  MDL *v22; 
  __int64 v23; 
  __int64 v24; 
  unsigned int v25; 
  __int64 v26; 
  _QWORD *v27; 
  unsigned __int64 v28; 
  _QWORD *v29; 
  _QWORD *v30; 
  _QWORD *v31; 
  unsigned __int64 v32; 
  PVOID BaseAddress; 
  PHYSICAL_ADDRESS v34; 
  int v35; 
  unsigned int v36; 
  ULONG NumberToClear; 
  PMDL MemoryDescriptorList; 
  PHYSICAL_ADDRESS v39; 
  BaseAddress = 0i64;
  v39.QuadPart = 0i64;
  v2 = a2;
  MemoryDescriptorList = 0i64;
  v3 = (a2 + 31) & 0xFFFFFFE0;
  v5 = (RTL_BITMAP *)HalpMmAllocCtxAlloc(a1, ((unsigned __int64)v3 >> 3) + 16);
  v6 = v5;
  if( !v5 )
    return 3221225626i64;
  v5->SizeOfBitMap = v3;
  v5->Buffer = &v5[1].SizeOfBitMap;
  RtlSetAllBits(v5);
  *(_QWORD *)(a1 + 16) = v6;
  v8 = 1;
LABEL_4:
  LODWORD(v10) = HalpDmaAllocateContiguousMemory(a1, v2, &BaseAddress, &v39, &MemoryDescriptorList);
  NumberToClear = v10;
  if( !(_DWORD)v10 )
    goto LABEL_18;
  v11 = *(_BYTE *)(a1 + 145) == 0;
  v34 = v39;
  if( v11 )
  {
    v9 = (unsigned __int64)v39.QuadPart >> 16;
    v12 = ((((unsigned __int64)(unsigned int)v10 << 12) + v39.QuadPart - 1) >> 16)
        - ((unsigned __int64)v39.QuadPart >> 16);
  }
  else
  {
    v12 = 0;
  }
  v13 = HalpMmAllocCtxAlloc(v9, 24i64);
  v15 = BaseAddress;
  v16 = v13;
  if( !v13 )
  {
LABEL_13:
    v22 = MemoryDescriptorList;
    if( MemoryDescriptorList )
    {
      if( v15 )
        MmUnmapLockedPages(v15, MemoryDescriptorList);
      MmFreePagesFromMdl(v22);
      ExFreePoolWithTag(v22, 0);
    }
    else
    {
      MmFreeContiguousMemory(v15);
    }
LABEL_18:
    v24 = HalpDmaAllocateContiguousPagesFromContiguousPool(a1, *(_QWORD *)(a1 + 152), v2, 0i64, 1, &NumberToClear);
    if( !v24 )
      goto LABEL_19;
    v10 = NumberToClear;
    v25 = 0;
    v26 = 0i64;
    v27 = 0i64;
    v23 = 0i64;
    v28 = v24;
    while( 1 )
    {
      v36 = v25;
      if( v25 >= (unsigned int)v10 )
      {
        RtlClearBits(*(RTL_BITMAP **)(a1 + 16), 0i64, (unsigned int)v10);
        goto LABEL_43;
      }
      if( v24 == v28 || v26 != v24 - 72 )
      {
        v29 = (_QWORD *)HalpMmAllocCtxAlloc(v23, 24i64);
        v23 = (__int64)v29;
        if( !v29 )
        {
          if( v27 )
          {
            v30 = *(_QWORD **)(a1 + 40);
            if( v30 )
            {
              do
              {
                v31 = (_QWORD *)*v30;
                HalpMmAllocCtxFree(v23, (__int64)v30);
                v30 = v31;
              }
              while( v31 );
            }
          }
          if( (_DWORD)v10 )
          {
            do
            {
              v32 = *(_QWORD *)(v28 + 8);
              HalpDmaReturnPageToSource(a1, v28);
              v28 = v32;
              --v10;
            }
            while( v10 );
          }
LABEL_19:
          if( v2 <= 1 )
          {
            HalpMmAllocCtxFree(v23, *(_QWORD *)(a1 + 16));
            return 3221225626i64;
          }
          v2 >>= 1;
          goto LABEL_4;
        }
        if( v27 )
          *v27 = v29;
        else
          *(_QWORD *)(a1 + 40) = v29;
        *v29 = 0i64;
        v27 = v29;
        v29[1] = 0i64;
        v29[2] = v24;
      }
      ++*(_DWORD *)(v23 + 8);
      v26 = v24;
      *(_QWORD *)(v24 + 48) &= 0xFFFFFFFFFFFFFFF3ui64;
      v24 = *(_QWORD *)(v24 + 8);
      v25 = v36 + 1;
    }
  }
  v35 = v12 + v10;
  v17 = HalpMmAllocCtxAlloc(v14, 72i64 * (unsigned int)(v12 + v10));
  v19 = v17;
  if( !v17 )
  {
LABEL_12:
    HalpMmAllocCtxFree(v18, v16);
    goto LABEL_13;
  }
  *(_QWORD *)v16 = 0i64;
  *(_DWORD *)(v16 + 12) = 0;
  memset(v17, 0i64);
  QuadPart = v34.QuadPart;
  *(_DWORD *)(v16 + 8) = v35;
  *(_QWORD *)(v16 + 16) = v19;
  *(_DWORD *)(a1 + 64) = 0;
  *(_QWORD *)(a1 + 40) = v16;
  *(_QWORD *)(a1 + 56) = v16;
  if( !HalpDmaCommitContiguousMapBuffers(a1, (__int64)v15, QuadPart, v10) )
  {
    HalpMmAllocCtxFree(v21, *(_QWORD *)(*(_QWORD *)(a1 + 40) + 16i64));
    goto LABEL_12;
  }
  if( MemoryDescriptorList )
  {
    *(_QWORD *)(a1 + 320) = MemoryDescriptorList;
    *(_QWORD *)(a1 + 328) = v15;
  }
  else
  {
    *(_QWORD *)(a1 + 320) = v15;
    v8 = 0;
  }
  *(_BYTE *)(a1 + 336) = v8;
LABEL_43:
  *(_DWORD *)(a1 + 224) = v10;
  return 0i64;
}

Referenced by:

HalpDmaAllocateChildAdapterV2
HalpDmaAllocateChildAdapterV3