HalpDmaAllocateScatterPagesFromContiguousPoolV2
_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateScatterPagesFromContiguousPoolV2(
_ADAPTER_OBJECT *ChildAdapter,
_HALP_DMA_ADAPTER_OBJECT *Adapter,
UINT64 PageCount,
INT64 NeedFullAllocation,
INT64 ForLocalPool,
UINT64 *PagesAllocated){
char v7;
unsigned int v8;
_HALP_DMA_ADAPTER_OBJECT *v9;
UINT8 *v10;
unsigned int ScatterTranslations;
unsigned int ScatterTranslations_high;
_HALP_DMA_TRANSLATION_ENTRY *result;
unsigned int v14;
UINT64 *p_SizeOfBitMap;
_HALP_DMA_TRANSLATION_ENTRY *v16;
_HALP_DMA_TRANSLATION_ENTRY *v17;
unsigned int v18;
unsigned int i;
unsigned int ClearBitsAndSet;
_HALP_DMA_TRANSLATION_ENTRY *v21;
_KLOCK_QUEUE_HANDLE LockHandle;
v7 = NeedFullAllocation;
memset(&LockHandle, 0, sizeof(LockHandle));
v8 = PageCount;
v9 = 0i64;
KeAcquireInStackQueuedSpinLock(&Adapter->SpinLock, &LockHandle);
if( (_BYTE)ForLocalPool )
{
ScatterTranslations = (unsigned int)Adapter[1].ScatterTranslations;
v9 = Adapter;
ScatterTranslations_high = HIDWORD(Adapter[1].ScatterTranslations);
if( ScatterTranslations <= ScatterTranslations_high )
{
LABEL_3:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
LABEL_4:
*(_DWORD *)PagesAllocated = 0;
return 0i64;
}
v14 = ScatterTranslations - ScatterTranslations_high;
if( v8 > v14 )
v8 = v14;
}
if( v7 )
{
p_SizeOfBitMap = (UINT64 *)&Adapter->ContiguousMapRegisters->SizeOfBitMap;
if( *(_DWORD *)p_SizeOfBitMap - RtlNumberOfSetBits(p_SizeOfBitMap) < v8 )
goto LABEL_3;
}
v16 = 0i64;
v17 = 0i64;
v18 = 0;
for( i = 0; v18 < v8; v17 = v21 )
{
ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
(_RTL_AVL_TABLE *)Adapter->ContiguousMapRegisters,
(VOID *)1,
i,
v10,
LockHandle.LockQueue.Next,
(_TABLE_SEARCH_RESULT)LockHandle.LockQueue.Lock);
if( ClearBitsAndSet == -1 )
break;
v21 = HalpDmaIndexToTranslationEntry(Adapter, (_HALP_DMA_TRANSLATION_BUFFER **)ClearBitsAndSet);
if( v16 )
v17->Next = v21;
else
v16 = v21;
++v18;
}
if( (_BYTE)ForLocalPool )
LODWORD(v9[1].ScatterTranslations) -= v18;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( !v18 )
goto LABEL_4;
result = v16;
*(_DWORD *)PagesAllocated = v18;
return result;
}Referenced by:
HalpDmaAllocateScatterPagesFromContiguousPool