HalpDmaAllocateScatterPagesFromContiguousPoolV3

_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateScatterPagesFromContiguousPoolV3(
        _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 v19; 
  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;
  v19 = 0;
  if( v8 )
  {
    do
    {
      ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
                                        (_RTL_AVL_TABLE *)Adapter->ContiguousMapRegisters,
                                        (VOID *)1,
                                        v19,
                                        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;
      v17 = v21;
    }
    while( v18 < v8 );
    if( v17 )
      v17->Next = 0i64;
  }
  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