HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV2

__int64 __fastcall HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV2(
        __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;
  while( 1 )
  {
    ClearBitsAndSet = RtlFindClearBitsAndSet(*(PRTL_BITMAP *)(a2 + 16), 1u, v5);
    if( ClearBitsAndSet == -1 )
      break;
    if( ClearBitsAndSet != v4 )
    {
      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;
      if( v6 < a3 )
        continue;
    }
    *a4 = v6;
    return v7;
  }
  return 0i64;
}

Referenced by:

HalpDmaAllocateMapRegistersAtHighLevel