MiConvertSmallPageRangeToLarge

INT64 __fastcall MiConvertSmallPageRangeToLarge(INT64 a1, INT64 a2){
  CHAR v2; 
  char *v3; 
  _BOOL8 v4; 
  unsigned __int64 v5; 
  char v6; 
  unsigned __int8 CurrentIrql; 
  volatile signed __int32 *v8; 
  INT64 result; 
  UINT64 SpinCount; 
  v2 = a2;
  v3 = (char *)MmGetPfnDb() + 48 * a1;
  v4 = (v3[34] & 7) != 6;
  v5 = (unsigned __int64)&v3[48 * MiLargePageSizes[(unsigned int)a2]];
  v6 = 0;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  if( (unsigned __int64)v3 < v5 )
  {
    v8 = (volatile signed __int32 *)(v3 + 24);
    do
    {
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64(v8, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *(__int64 *)v8 < 0 );
      }
      MiConvertLockedSmallPageToLarge((INT64)(v8 - 6), (INT64)v3, v2, v4);
      _InterlockedAnd64((volatile signed __int64 *)v8, 0x7FFFFFFFFFFFFFFFui64);
      if( (v6 & 0xF) == 0 && CurrentIrql < 2u && KeShouldYieldProcessor() )
      {
        __writecr8(CurrentIrql);
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(2ui64);
      }
      v8 += 12;
      ++v6;
    }
    while( (unsigned __int64)(v8 - 6) < v5 );
  }
  result = CurrentIrql;
  __writecr8(CurrentIrql);
  return result;
}

Referenced by:

MiAllocateLargeZeroPages
MiDeleteSubsectionLargePages
MiFreeLargePageMemory
MiRebuildLargePage