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