MiTrimSystemImagePages
NTSTATUS __stdcall MiTrimSystemImagePages(_MMPTE *EntryPte, _MMPTE *LastPte){
int v2;
NTSTATUS v3;
_MMPTE *v5;
_MMPFN *PfnDb;
__int64 v7;
unsigned __int64 v8;
_MMPFN *v9;
_UNICODE_STRING *v10;
UINT8 v11;
PWCHAR v12;
int v13;
__int64 v14;
__int64 v15;
__int64 v16;
int v17;
unsigned __int64 v18;
__int64 v19;
int v20;
_UNICODE_STRING *v21;
UINT8 v22;
wchar_t *v23;
_MMPTE v24;
volatile signed __int32 *p_u2;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v26;
int v27;
char v28;
__int64 v29;
__int64 v30;
_MMPFN *v31;
UINT64 v33;
INT64 v34;
UINT64 SpinCount;
LODWORD(SpinCount) = v2;
v3 = 0;
v5 = EntryPte;
if( EntryPte <= LastPte )
{
PfnDb = MmGetPfnDb();
do
{
LODWORD(v7) = MI_READ_PTE_LOCK_FREE((INT64)v5);
if( (v7 & 1) == 0 && (v7 & 0x400) != 0 )
{
v34 = v7 & 0xFFFFFFFFFFFFFBFEui64 | 1;
LODWORD(v8) = MI_READ_PTE_LOCK_FREE((INT64)&v34);
v9 = &PfnDb[(v8 >> 12) & 0xFFFFFFFFFi64];
LOBYTE(v13) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v9, v10, v11, v12);
if( v13 )
{
v14 = MiSwizzleInvalidPte((v9->PteLong << 16) | 0x400);
v16 = v14;
if( (v9->u4._bf_0 & 0x1000000000i64) == 0 && v15 > 0 )
v16 = v14 | 0x800;
}
else
{
v17 = (*((_DWORD *)&v9->3 + 4) >> 5) & 0x1F;
LODWORD(v18) = MI_READ_PTE_LOCK_FREE((INT64)&v34);
LODWORD(v19) = MiMakeTransitionPte((v18 >> 12) & 0xFFFFFFFFFi64, v17);
v16 = v19;
}
LOBYTE(v20) = MiPteInShadowRange((UINT64)v5);
if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v16 & 1) != 0 )
v16 |= 0x8000000000000000ui64;
v5->u.Long = v16;
v24.u.Long = 0i64;
p_u2 = (volatile signed __int32 *)&v9->u2;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64(p_u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)p_u2 < 0 );
}
*((_BYTE *)&v9->u3 + 3) &= ~8u;
if( (v34 & 0x42) != 0 )
{
MiCaptureDirtyBitToPfn();
v24.u.Long = v26.Long;
}
LOBYTE(v27) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v9, v21, v22, v23);
if( v27 )
{
LODWORD(v29) = MiGetContainingPageTable((UINT64)v5);
v30 = v29;
}
else
{
v30 = -1i64;
}
*((_BYTE *)&v9->u3 + 3) = v28 & 0xF8 | 2;
MiDecrementShareCount(v9);
if( v30 != -1 )
{
_InterlockedAnd64((volatile signed __int64 *)p_u2, 0x7FFFFFFFFFFFFFFFui64);
v31 = &MmGetPfnDb()[v30];
LODWORD(v33) = 0;
p_u2 = (volatile signed __int32 *)&v31->u2;
while( _interlockedbittestandset64(p_u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v33);
while( *(__int64 *)p_u2 < 0 );
}
MiDecrementShareCount(v31);
}
_InterlockedAnd64((volatile signed __int64 *)p_u2, 0x7FFFFFFFFFFFFFFFui64);
if( v24.u.Long )
MiReleasePageFileInfo(&Irp, v24, 1ui64);
++v3;
PfnDb = MmGetPfnDb();
}
++v5;
}
while( v5 <= LastPte );
}
return v3;
}Referenced by:
MiSetPagingOfDriver