HalpDmaAllocateScatterPagesFromContiguousPoolV2

_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateScatterPagesFromContiguousPoolV2(
        _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; 
  UINT8 *v10; 
  unsigned int ScatterTranslations; 
  unsigned int ScatterTranslations_high; 
  _HALP_DMA_TRANSLATION_ENTRY *result; 
  unsigned int v14; 
  UINT64 *p_SizeOfBitMap; 
  _HALP_DMA_TRANSLATION_ENTRY *v16; 
  _HALP_DMA_TRANSLATION_ENTRY *v17; 
  unsigned int v18; 
  unsigned int i; 
  unsigned int ClearBitsAndSet; 
  _HALP_DMA_TRANSLATION_ENTRY *v21; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  v7 = NeedFullAllocation;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v8 = PageCount;
  v9 = 0i64;
  KeAcquireInStackQueuedSpinLock(&Adapter->SpinLock, &LockHandle);
  if( (_BYTE)ForLocalPool )
  {
    ScatterTranslations = (unsigned int)Adapter[1].ScatterTranslations;
    v9 = Adapter;
    ScatterTranslations_high = HIDWORD(Adapter[1].ScatterTranslations);
    if( ScatterTranslations <= ScatterTranslations_high )
    {
LABEL_3:
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
LABEL_4:
      *(_DWORD *)PagesAllocated = 0;
      return 0i64;
    }
    v14 = ScatterTranslations - ScatterTranslations_high;
    if( v8 > v14 )
      v8 = v14;
  }
  if( v7 )
  {
    p_SizeOfBitMap = (UINT64 *)&Adapter->ContiguousMapRegisters->SizeOfBitMap;
    if( *(_DWORD *)p_SizeOfBitMap - RtlNumberOfSetBits(p_SizeOfBitMap) < v8 )
      goto LABEL_3;
  }
  v16 = 0i64;
  v17 = 0i64;
  v18 = 0;
  for( i = 0; v18 < v8; v17 = v21 )
  {
    ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
                                      (_RTL_AVL_TABLE *)Adapter->ContiguousMapRegisters,
                                      (VOID *)1,
                                      i,
                                      v10,
                                      LockHandle.LockQueue.Next,
                                      (_TABLE_SEARCH_RESULT)LockHandle.LockQueue.Lock);
    if( ClearBitsAndSet == -1 )
      break;
    v21 = HalpDmaIndexToTranslationEntry(Adapter, (_HALP_DMA_TRANSLATION_BUFFER **)ClearBitsAndSet);
    if( v16 )
      v17->Next = v21;
    else
      v16 = v21;
    ++v18;
  }
  if( (_BYTE)ForLocalPool )
    LODWORD(v9[1].ScatterTranslations) -= v18;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( !v18 )
    goto LABEL_4;
  result = v16;
  *(_DWORD *)PagesAllocated = v18;
  return result;
}

Referenced by:

HalpDmaAllocateScatterPagesFromContiguousPool