HalpDmaAllocateScatterPagesFromScatterPoolV2
_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateScatterPagesFromScatterPoolV2(
_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;
unsigned int Buffer;
unsigned int Buffer_high;
_HALP_DMA_TRANSLATION_ENTRY *result;
unsigned int v13;
unsigned int NumberOfFreeScatterBuffers;
_HALP_DMA_TRANSLATION_ENTRY *ScatterBufferListHead;
_HALP_DMA_TRANSLATION_ENTRY *v16;
__int64 v17;
_KLOCK_QUEUE_HANDLE LockHandle;
v7 = NeedFullAllocation;
memset(&LockHandle, 0, sizeof(LockHandle));
v8 = 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( v8 > v13 )
v8 = v13;
}
NumberOfFreeScatterBuffers = Adapter->NumberOfFreeScatterBuffers;
if( v8 > NumberOfFreeScatterBuffers )
{
v8 = 0;
if( !v7 )
v8 = Adapter->NumberOfFreeScatterBuffers;
}
if( !v8 )
goto LABEL_3;
ScatterBufferListHead = Adapter->ScatterBufferListHead;
v16 = ScatterBufferListHead;
v17 = v8;
do
{
v16 = v16->Next;
--v17;
}
while( v17 );
Adapter->ScatterBufferListHead = v16;
Adapter->NumberOfFreeScatterBuffers = NumberOfFreeScatterBuffers - v8;
if( (_BYTE)ForLocalPool )
LODWORD(v9[1].ContiguousTranslationEnd.Buffer) -= v8;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
result = ScatterBufferListHead;
*(_DWORD *)PagesAllocated = v8;
return result;
}Referenced by:
HalpDmaAllocateScatterPagesFromScatterPool