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