HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV2

_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV2(
        _ADAPTER_OBJECT *ChildAdapter,
        _HALP_DMA_ADAPTER_OBJECT *Adapter,
        UINT64 PageCount,
        UINT64 *PagesAllocated){
  int v4; 
  UINT32 v5; 
  unsigned int v6; 
  _HALP_DMA_TRANSLATION_ENTRY *v7; 
  _HALP_DMA_TRANSLATION_ENTRY *v8; 
  unsigned int v10; 
  UINT32 ClearBitsAndSet; 
  _HALP_DMA_TRANSLATION_ENTRY *v13; 
  VOID *v15; 
  _TABLE_SEARCH_RESULT v16; 

  v4 = -1;
  v5 = 0;
  v6 = 0;
  v7 = 0i64;
  v8 = 0i64;
  v10 = PageCount;
  while( 1 )
  {
    ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
                                      (_RTL_AVL_TABLE *)Adapter->ContiguousMapRegisters,
                                      (VOID *)1,
                                      v5,
                                      (UINT8 *)PagesAllocated,
                                      v15,
                                      v16);
    if( ClearBitsAndSet == -1 )
      break;
    if( ClearBitsAndSet != v4 )
    {
      if( v4 == -1 )
        v4 = ClearBitsAndSet;
      v13 = HalpDmaIndexToTranslationEntry(Adapter, (_HALP_DMA_TRANSLATION_BUFFER **)ClearBitsAndSet);
      if( ((unsigned __int64)v13->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64) != 0 )
      {
        if( v7 )
          v8->Next = v13;
        else
          v7 = v13;
        ++v6;
        v8 = v13;
      }
      else
      {
        RtlClearBits(Adapter->ContiguousMapRegisters, ClearBitsAndSet, 1u);
      }
      v5 = ClearBitsAndSet + 1;
      if( v6 < v10 )
        continue;
    }
    *(_DWORD *)PagesAllocated = v6;
    return v7;
  }
  return 0i64;
}

Referenced by:

HalpDmaAllocateMapRegistersAtHighLevel