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