HalpDmaAllocateContiguousPagesFromContiguousPoolV3

_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateContiguousPagesFromContiguousPoolV3(
        _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; 
  unsigned int ClearBitsAndSet; 
  _HALP_DMA_TRANSLATION_ENTRY *v16; 
  _HALP_DMA_TRANSLATION_ENTRY *v17; 
  __int64 v18; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  v7 = NeedFullAllocation;
  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 )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
LABEL_4:
      *(_DWORD *)PagesAllocated = 0;
      return 0i64;
    }
    v14 = ScatterTranslations - ScatterTranslations_high;
    if( v8 > v14 )
      v8 = v14;
  }
  ClearBitsAndSet = -1;
  if( v8 )
  {
    while( 1 )
    {
      ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
                                        (_RTL_AVL_TABLE *)Adapter->ContiguousMapRegisters,
                                        (VOID *)v8,
                                        0i64,
                                        v10,
                                        LockHandle.LockQueue.Next,
                                        (_TABLE_SEARCH_RESULT)LockHandle.LockQueue.Lock);
      if( ClearBitsAndSet != -1 )
        break;
      if( !v7 )
      {
        v8 >>= 1;
        if( v8 )
          continue;
      }
      goto LABEL_14;
    }
    if( (_BYTE)ForLocalPool )
      LODWORD(v9[1].ScatterTranslations) -= v8;
  }
LABEL_14:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( ClearBitsAndSet == -1 )
    goto LABEL_4;
  result = HalpDmaLinkContiguousTranslations(Adapter, ClearBitsAndSet, v8);
  v16 = 0i64;
  v17 = result;
  if( v8 )
  {
    v18 = v8;
    do
    {
      v16 = v17;
      v17 = v17->Next;
      --v18;
    }
    while( v18 );
  }
  v16->Next = 0i64;
  *(_DWORD *)PagesAllocated = v8;
  return result;
}

Referenced by:

HalpDmaAllocateContiguousPagesFromContiguousPool