MiConvertSmallPageRangeToLarge

NTSTATUS __stdcall MiConvertSmallPageRangeToLarge(INT64 a1, INT64 a2){
  CHAR v2; 
  _MMPFN *v3; 
  _BOOL8 v4; 
  unsigned __int64 v5; 
  char v6; 
  unsigned __int8 CurrentIrql; 
  volatile signed __int32 *p_u2; 
  NTSTATUS result; 
  UINT64 SpinCount; 

  v2 = a2;
  v3 = &MmGetPfnDb()[a1];
  v4 = (*(_BYTE *)(&v3->u3 + 1) & 7) != 6;
  v5 = (unsigned __int64)&v3[MiLargePageSizes[(unsigned int)a2]];
  v6 = 0;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  if( (unsigned __int64)v3 < v5 )
  {
    p_u2 = (volatile signed __int32 *)&v3->u2;
    do
    {
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64(p_u2, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *(__int64 *)p_u2 < 0 );
      }
      MiConvertLockedSmallPageToLarge((INT64)(p_u2 - 6), (INT64)v3, v2, v4);
      _InterlockedAnd64((volatile signed __int64 *)p_u2, 0x7FFFFFFFFFFFFFFFui64);
      if( (v6 & 0xF) == 0 && CurrentIrql < 2u && (unsigned int)KeShouldYieldProcessor() )
      {
        __writecr8(CurrentIrql);
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(2ui64);
      }
      p_u2 += 12;
      ++v6;
    }
    while( (unsigned __int64)(p_u2 - 6) < v5 );
  }
  result = CurrentIrql;
  __writecr8(CurrentIrql);
  return result;
}

Referenced by:

MiDeleteSubsectionLargePages
MiFreeLargePageMemory
MiRebuildLargePage