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