HalpDmaAllocateContiguousPagesFromContiguousPoolV3
_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateContiguousPagesFromContiguousPoolV3(
_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;
unsigned int ClearBitsAndSet;
_HALP_DMA_TRANSLATION_ENTRY *v16;
_HALP_DMA_TRANSLATION_ENTRY *v17;
__int64 v18;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
v7 = NeedFullAllocation;
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 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
LABEL_4:
*(_DWORD *)PagesAllocated = 0;
return 0i64;
}
v14 = ScatterTranslations - ScatterTranslations_high;
if( v8 > v14 )
v8 = v14;
}
ClearBitsAndSet = -1;
if( v8 )
{
while( 1 )
{
ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
(_RTL_AVL_TABLE *)Adapter->ContiguousMapRegisters,
(VOID *)v8,
0i64,
v10,
LockHandle.LockQueue.Next,
(_TABLE_SEARCH_RESULT)LockHandle.LockQueue.Lock);
if( ClearBitsAndSet != -1 )
break;
if( !v7 )
{
v8 >>= 1;
if( v8 )
continue;
}
goto LABEL_14;
}
if( (_BYTE)ForLocalPool )
LODWORD(v9[1].ScatterTranslations) -= v8;
}
LABEL_14:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( ClearBitsAndSet == -1 )
goto LABEL_4;
result = HalpDmaLinkContiguousTranslations(Adapter, ClearBitsAndSet, v8);
v16 = 0i64;
v17 = result;
if( v8 )
{
v18 = v8;
do
{
v16 = v17;
v17 = v17->Next;
--v18;
}
while( v18 );
}
v16->Next = 0i64;
*(_DWORD *)PagesAllocated = v8;
return result;
}Referenced by:
HalpDmaAllocateContiguousPagesFromContiguousPool