HalpDmaAllocateScatterPagesFromScatterPoolV3
_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateScatterPagesFromScatterPoolV3(
_ADAPTER_OBJECT *ChildAdapter,
_HALP_DMA_ADAPTER_OBJECT *Adapter,
UINT64 PageCount,
INT64 NeedFullAllocation,
INT64 ForLocalPool,
UINT64 *PagesAllocated){
char v7;
unsigned int NumberOfFreeScatterBuffers;
_HALP_DMA_ADAPTER_OBJECT *v9;
unsigned int Buffer;
unsigned int Buffer_high;
_HALP_DMA_TRANSLATION_ENTRY *result;
unsigned int v13;
_HALP_DMA_TRANSLATION_ENTRY *ScatterBufferListHead;
_HALP_DMA_TRANSLATION_ENTRY *v15;
__int64 v16;
_HALP_DMA_TRANSLATION_ENTRY *v17;
_KLOCK_QUEUE_HANDLE LockHandle;
v7 = NeedFullAllocation;
memset(&LockHandle, 0, sizeof(LockHandle));
NumberOfFreeScatterBuffers = PageCount;
v9 = 0i64;
KeAcquireInStackQueuedSpinLock(&Adapter->SpinLock, &LockHandle);
if( (_BYTE)ForLocalPool )
{
Buffer = (unsigned int)Adapter[1].ContiguousTranslationEnd.Buffer;
v9 = Adapter;
Buffer_high = HIDWORD(Adapter[1].ContiguousTranslationEnd.Buffer);
if( Buffer <= Buffer_high )
{
LABEL_3:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
*(_DWORD *)PagesAllocated = 0;
return 0i64;
}
v13 = Buffer - Buffer_high;
if( NumberOfFreeScatterBuffers > v13 )
NumberOfFreeScatterBuffers = v13;
}
if( NumberOfFreeScatterBuffers > Adapter->NumberOfFreeScatterBuffers )
{
NumberOfFreeScatterBuffers = 0;
if( !v7 )
NumberOfFreeScatterBuffers = Adapter->NumberOfFreeScatterBuffers;
}
if( !NumberOfFreeScatterBuffers )
goto LABEL_3;
ScatterBufferListHead = Adapter->ScatterBufferListHead;
v15 = ScatterBufferListHead;
v16 = NumberOfFreeScatterBuffers;
do
{
v17 = v15;
v15 = v15->Next;
--v16;
}
while( v16 );
v17->Next = 0i64;
Adapter->NumberOfFreeScatterBuffers -= NumberOfFreeScatterBuffers;
Adapter->ScatterBufferListHead = v15;
if( (_BYTE)ForLocalPool )
LODWORD(v9[1].ContiguousTranslationEnd.Buffer) -= NumberOfFreeScatterBuffers;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
result = ScatterBufferListHead;
*(_DWORD *)PagesAllocated = NumberOfFreeScatterBuffers;
return result;
}Referenced by:
HalpDmaAllocateScatterPagesFromScatterPool