HalpDmaAllocateScatterPagesFromScatterPoolAtHighLevelV3
_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateScatterPagesFromScatterPoolAtHighLevelV3(
_ADAPTER_OBJECT *ChildAdapter,
_HALP_DMA_ADAPTER_OBJECT *Adapter,
UINT64 PageCount,
UINT64 *PagesAllocated){
unsigned int NumberOfFreeScatterBuffers;
_HALP_DMA_TRANSLATION_ENTRY *ScatterBufferListHead;
unsigned int v7;
_HALP_DMA_TRANSLATION_ENTRY *v8;
_HALP_DMA_TRANSLATION_ENTRY *v9;
_HALP_DMA_TRANSLATION_ENTRY *v10;
unsigned int v11;
_HALP_DMA_TRANSLATION_ENTRY *v12;
_HALP_DMA_TRANSLATION_ENTRY *result;
NumberOfFreeScatterBuffers = Adapter->NumberOfFreeScatterBuffers;
ScatterBufferListHead = Adapter->ScatterBufferListHead;
v7 = 0;
v8 = 0i64;
v9 = 0i64;
v10 = 0i64;
v11 = 0;
v12 = 0i64;
if( !NumberOfFreeScatterBuffers )
goto LABEL_17;
do
{
if( v11 >= (unsigned int)PageCount )
break;
if( ((unsigned __int64)ScatterBufferListHead->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64) != 0 )
{
if( v8 )
v10->Next = ScatterBufferListHead;
else
v8 = ScatterBufferListHead;
++v11;
v10 = ScatterBufferListHead;
}
else
{
if( v9 )
v9->Next = ScatterBufferListHead;
else
Adapter->ScatterBufferListHead = ScatterBufferListHead;
v9 = ScatterBufferListHead;
}
++v7;
v12 = ScatterBufferListHead;
ScatterBufferListHead = ScatterBufferListHead->Next;
}
while( v7 < NumberOfFreeScatterBuffers );
if( v12 )
v12->Next = 0i64;
if( v9 )
v9->Next = ScatterBufferListHead;
else
LABEL_17:
Adapter->ScatterBufferListHead = ScatterBufferListHead;
Adapter->NumberOfFreeScatterBuffers -= v11;
result = v8;
*(_DWORD *)PagesAllocated = v11;
return result;
}Referenced by:
HalpDmaAllocateScatterPagesFromScatterPoolAtHighLevel