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