HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV2
_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV2(
_ADAPTER_OBJECT *ChildAdapter,
_HALP_DMA_ADAPTER_OBJECT *Adapter,
UINT64 PageCount,
UINT64 *PagesAllocated){
int v4;
UINT32 v5;
unsigned int v6;
_HALP_DMA_TRANSLATION_ENTRY *v7;
_HALP_DMA_TRANSLATION_ENTRY *v8;
unsigned int v10;
UINT32 ClearBitsAndSet;
_HALP_DMA_TRANSLATION_ENTRY *v13;
VOID *v15;
_TABLE_SEARCH_RESULT v16;
v4 = -1;
v5 = 0;
v6 = 0;
v7 = 0i64;
v8 = 0i64;
v10 = PageCount;
while( 1 )
{
ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
(_RTL_AVL_TABLE *)Adapter->ContiguousMapRegisters,
(VOID *)1,
v5,
(UINT8 *)PagesAllocated,
v15,
v16);
if( ClearBitsAndSet == -1 )
break;
if( ClearBitsAndSet != v4 )
{
if( v4 == -1 )
v4 = ClearBitsAndSet;
v13 = HalpDmaIndexToTranslationEntry(Adapter, (_HALP_DMA_TRANSLATION_BUFFER **)ClearBitsAndSet);
if( ((unsigned __int64)v13->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64) != 0 )
{
if( v7 )
v8->Next = v13;
else
v7 = v13;
++v6;
v8 = v13;
}
else
{
RtlClearBits(Adapter->ContiguousMapRegisters, ClearBitsAndSet, 1u);
}
v5 = ClearBitsAndSet + 1;
if( v6 < v10 )
continue;
}
*(_DWORD *)PagesAllocated = v6;
return v7;
}
return 0i64;
}Referenced by:
HalpDmaAllocateMapRegistersAtHighLevel