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