HalpDmaAllocateScatterPagesFromScatterPoolAtHighLevelV3

_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateScatterPagesFromScatterPoolAtHighLevelV3(
        _ADAPTER_OBJECT *ChildAdapter,
        _HALP_DMA_ADAPTER_OBJECT *Adapter,
        UINT64 PageCount,
        UINT64 *PagesAllocated){
  unsigned int NumberOfFreeScatterBuffers; 
  _HALP_DMA_TRANSLATION_ENTRY *ScatterBufferListHead; 
  unsigned int v7; 
  _HALP_DMA_TRANSLATION_ENTRY *v8; 
  _HALP_DMA_TRANSLATION_ENTRY *v9; 
  _HALP_DMA_TRANSLATION_ENTRY *v10; 
  unsigned int v11; 
  _HALP_DMA_TRANSLATION_ENTRY *v12; 
  _HALP_DMA_TRANSLATION_ENTRY *result; 

  NumberOfFreeScatterBuffers = Adapter->NumberOfFreeScatterBuffers;
  ScatterBufferListHead = Adapter->ScatterBufferListHead;
  v7 = 0;
  v8 = 0i64;
  v9 = 0i64;
  v10 = 0i64;
  v11 = 0;
  v12 = 0i64;
  if( !NumberOfFreeScatterBuffers )
    goto LABEL_17;
  do
  {
    if( v11 >= (unsigned int)PageCount )
      break;
    if( ((unsigned __int64)ScatterBufferListHead->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64) != 0 )
    {
      if( v8 )
        v10->Next = ScatterBufferListHead;
      else
        v8 = ScatterBufferListHead;
      ++v11;
      v10 = ScatterBufferListHead;
    }
    else
    {
      if( v9 )
        v9->Next = ScatterBufferListHead;
      else
        Adapter->ScatterBufferListHead = ScatterBufferListHead;
      v9 = ScatterBufferListHead;
    }
    ++v7;
    v12 = ScatterBufferListHead;
    ScatterBufferListHead = ScatterBufferListHead->Next;
  }
  while( v7 < NumberOfFreeScatterBuffers );
  if( v12 )
    v12->Next = 0i64;
  if( v9 )
    v9->Next = ScatterBufferListHead;
  else
LABEL_17:
    Adapter->ScatterBufferListHead = ScatterBufferListHead;
  Adapter->NumberOfFreeScatterBuffers -= v11;
  result = v8;
  *(_DWORD *)PagesAllocated = v11;
  return result;
}

Referenced by:

HalpDmaAllocateScatterPagesFromScatterPoolAtHighLevel