HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV2
__int64 __fastcall HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV2(
__int64 a1,
__int64 a2,
unsigned int a3,
unsigned int *a4){
int v4;
ULONG v5;
unsigned int v6;
__int64 v7;
__int64 v8;
unsigned int ClearBitsAndSet;
__int64 v13;
v4 = -1;
v5 = 0;
v6 = 0;
v7 = 0i64;
v8 = 0i64;
while( 1 )
{
ClearBitsAndSet = RtlFindClearBitsAndSet(*(PRTL_BITMAP *)(a2 + 16), 1u, v5);
if( ClearBitsAndSet == -1 )
break;
if( ClearBitsAndSet != v4 )
{
if( v4 == -1 )
v4 = ClearBitsAndSet;
v13 = HalpDmaIndexToTranslationEntry(a2, ClearBitsAndSet, 0i64);
if( (*(_QWORD *)(v13 + 48) & 0xFFFFFFFFFFFFF000ui64) != 0 )
{
if( v7 )
*(_QWORD *)(v8 + 8) = v13;
else
v7 = v13;
++v6;
v8 = v13;
}
else
{
RtlClearBits(*(RTL_BITMAP **)(a2 + 16), ClearBitsAndSet, 1ui64);
}
v5 = ClearBitsAndSet + 1;
if( v6 < a3 )
continue;
}
*a4 = v6;
return v7;
}
return 0i64;
}Referenced by:
HalpDmaAllocateMapRegistersAtHighLevel