HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV3

__int64 __fastcall HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV3(
        __int64 a1,
        __int64 a2,
        unsigned int a3,
        unsigned int *a4){
  int v4; 
  ULONG v5; 
  unsigned int v6; 
  __int64 v7; 
  __int64 v8; 
  unsigned int ClearBitsAndSet; 
  __int64 v13; 
  v4 = -1;
  v5 = 0;
  v6 = 0;
  v7 = 0i64;
  v8 = 0i64;
  do
  {
    ClearBitsAndSet = RtlFindClearBitsAndSet(*(PRTL_BITMAP *)(a2 + 16), 1u, v5);
    if( ClearBitsAndSet == -1 )
      return 0i64;
    if( ClearBitsAndSet == v4 )
      break;
    if( v4 == -1 )
      v4 = ClearBitsAndSet;
    v13 = HalpDmaIndexToTranslationEntry(a2, ClearBitsAndSet, 0i64);
    if( (*(_QWORD *)(v13 + 48) & 0xFFFFFFFFFFFFF000ui64) != 0 )
    {
      if( v7 )
        *(_QWORD *)(v8 + 8) = v13;
      else
        v7 = v13;
      ++v6;
      v8 = v13;
    }
    else
    {
      RtlClearBits(*(RTL_BITMAP **)(a2 + 16), ClearBitsAndSet, 1ui64);
    }
    v5 = ClearBitsAndSet + 1;
  }
  while( v6 < a3 );
  if( v8 )
    *(_QWORD *)(v8 + 8) = 0i64;
  *a4 = v6;
  return v7;
}

Referenced by:

HalpDmaAllocateMapRegistersAtHighLevel