MiMakeSystemLeavesNonZero
CHAR __fastcall MiMakeSystemLeavesNonZero(INT64 a1, INT64 a2, INT64 a3){
int v3;
_MMPTE *PteBase;
unsigned __int64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
__int64 v8;
_QWORD *v9;
unsigned __int64 v10;
_ETHREAD *CurrentThread;
unsigned __int64 v12;
int i;
unsigned __int64 v14;
int v15;
bool v16;
v3 = a3;
PteBase = MmGetPteBase();
v5 = *(_QWORD *)(a1 + 32);
v6 = *(_QWORD *)(a1 + 40);
v7 = ((a2 << 25) - ((_QWORD)PteBase << 25)) >> 16;
if( v3 > 0 )
{
v8 = (unsigned int)v3;
do
{
v5 = (unsigned __int64)PteBase + ((v5 >> 9) & 0x7FFFFFFFF8i64);
v6 = (unsigned __int64)PteBase + ((v6 >> 9) & 0x7FFFFFFFF8i64);
--v8;
}
while( v8 );
}
v9 = (_QWORD *)v7;
v10 = v7 + 4088;
if( v5 >= v7 )
v9 = (_QWORD *)v5;
if( v6 < v7 + 4096 )
v10 = v6;
CurrentThread = (_ETHREAD *)MiSwizzleInvalidPte(768i64);
v12 = (unsigned __int64)CurrentThread;
for( i = ((__int64)(v10 - (_QWORD)v9) >> 3) + 1; i; --i )
{
v14 = v12;
v15 = 0;
LODWORD(CurrentThread) = MiPteInShadowRange((UINT64)v9);
if( (_DWORD)CurrentThread )
{
LODWORD(CurrentThread) = MiPteHasShadow();
if( (_DWORD)CurrentThread )
{
v15 = 1;
if( !HIBYTE(word_140C4DD48) )
{
v16 = (v12 & 1) == 0;
goto LABEL_19;
}
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (*(_DWORD *)(*((_QWORD *)CurrentThread + 23) + 2172i64) & 0x1000) != 0 )
{
v16 = (v12 & 1) == 0;
LABEL_19:
if( !v16 )
v14 = v12 | 0x8000000000000000ui64;
}
}
}
*v9 = v14;
if( v15 )
LOBYTE(CurrentThread) = MiWritePteShadow();
++v9;
}
return(char)CurrentThread;
}Referenced by:
MiComputePxeWalkAction
MiCreateSystemPageTable