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