MiCountSharedPages
NTSTATUS __stdcall MiCountSharedPages(_MMVAD *Vad, _MMPTE *PointerPte, _MMPTE *LastPte){
__int64 v6;
unsigned __int8 v7;
_MMPTE *v8;
__int64 v9;
__int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
VOID *v13;
_MMSUPPORT_FULL *AnyMultiplexedVm;
NTSTATUS v15;
UINT8 v16;
wchar_t *v17;
_MMPTE *PteBase;
_MMPTE *v19;
_MMPTE *v20;
UINT64 v21;
unsigned int v22;
_MMPTE *Pml4eBase;
__int64 v24;
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;} v25;
_UNICODE_STRING *PxeUserLimit;
_UNICODE_STRING *v27;
int v28;
__int64 v29;
int v30;
__int64 v31;
unsigned __int8 v33;
INT64 p_Vm;
UINT64 v35;
__int64 v36;
__int128 v37;
__int64 v38;
_QWORD v39[22];
v6 = 0i64;
p_Vm = (INT64)&KeGetCurrentThread()->ApcState.Process->Vm;
MiLockWorkingSetShared();
v33 = v7;
if( PointerPte > LastPte )
goto LABEL_55;
v8 = PointerPte;
v9 = (_QWORD)MmGetPteBase() << 25;
v36 = v9;
v10 = (((_QWORD)LastPte << 25) - v9) >> 16;
v38 = v10;
LABEL_3:
v37 = 0i64;
memset((char *)v39 + 2, 0i64, 0xAEu);
LOWORD(v39[0]) = 2145;
v11 = (((_QWORD)v8 << 25) - v9) >> 16;
LODWORD(v12) = MiGetLeafVa(v11);
if( v12 < 0xFFFF800000000000ui64 || v12 >= *(&stru_140C4DB30 + 937) && v12 <= *(&stru_140C4DB30 + 175) )
AnyMultiplexedVm = &KeGetCurrentThread()->ApcState.Process->Vm;
else
AnyMultiplexedVm = (_MMSUPPORT_FULL *)MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemViews, v13);
v15 = MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, v11);
if( v15 )
{
LODWORD(v37) = v15 - 1;
PteBase = MmGetPteBase();
v19 = (_MMPTE *)((char *)PteBase + ((v11 >> 9) & 0x7FFFFFFFF8i64));
*((_QWORD *)&v37 + 1) = v19;
}
else
{
LOWORD(v39[0]) |= 4u;
v39[21] = &v37;
v39[2] = 0i64;
v39[3] = AnyMultiplexedVm;
BYTE2(v39[0]) = BYTE2(v39[0]) & 0xE3 | 4;
v39[20] = MiGetNextPageTableTail;
BYTE6(v39[0]) = v33;
v39[4] = v11;
v39[5] = v10;
MiWalkPageTables((INT64)v39);
v19 = (_MMPTE *)*((_QWORD *)&v37 + 1);
PteBase = MmGetPteBase();
}
if( v19 )
{
v21 = (UINT64)PteBase + (((unsigned __int64)v19 >> 9) & 0x7FFFFFFFF8i64);
v20 = LastPte + 1;
}
else
{
v20 = LastPte + 1;
v21 = 0i64;
v19 = LastPte + 1;
}
v22 = Vad->Core.u.LongFlags >> 7;
v35 = v21;
if( (Vad->Core.u.LongFlags & 0x70) != 32 || (v22 & 0x1F) == 1 )
{
if( (v22 & 5) != 5 )
v6 += v19 - PointerPte;
PointerPte = v19;
}
else
{
for( ; PointerPte < v19; ++PointerPte )
{
if( MiPteNeedsCommitCharge(Vad, PointerPte) == 1 )
++v6;
}
}
if( PointerPte != v20 )
{
Pml4eBase = MmGetPml4eBase();
v24 = (((_QWORD)PointerPte << 25) - v36) >> 16;
while( 1 )
{
v25.Long = (unsigned __int64)PointerPte->u;
PxeUserLimit = (_UNICODE_STRING *)MmGetPxeUserLimit();
if( PointerPte >= Pml4eBase && PointerPte <= (_MMPTE *)PxeUserLimit )
PxeUserLimit = (_UNICODE_STRING *)MmGetPxeUserLimit();
if( v25.Long )
{
if( (v25.Long & 1) != 0 )
{
if( (v25.Long & 0x200) != 0 )
goto LABEL_48;
v27 = (_UNICODE_STRING *)&MmGetPfnDb()[(v25.Long >> 12) & 0xFFFFFFFFFi64];
LOBYTE(v28) = MI_PFN_IS_PROTO(v27, PxeUserLimit, v16, v17);
if( !v28 )
goto LABEL_48;
MiGetProtoPteAddress();
if( ((unsigned __int64)v27->Buffer | 0x8000000000000000ui64) != v29 )
goto LABEL_48;
}
else
{
if( (v25.Long & 0x400) == 0 )
goto LABEL_48;
LOBYTE(v30) = MiIsPrototypePteVadLookup(v25.Long);
if( v30 )
{
if( (v25.Long & 0xA0) == 0xA0 )
goto LABEL_48;
}
else
{
if( *(&stru_140C4DB30 + 42) && (v25.Long & 0x10) == 0 )
v25.Long &= ~*(&stru_140C4DB30 + 42);
MiGetProtoPteAddress();
if( v25.Hard._bf_0 >> 16 != v31
|| (Vad->Core.u.LongFlags & 0x70) == 32 && MiPteNeedsCommitCharge(Vad, PointerPte) != 1 )
{
goto LABEL_48;
}
}
}
}
else if( MiPteNeedsCommitCharge(Vad, PointerPte) != 1 )
{
goto LABEL_48;
}
++v6;
LABEL_48:
++PointerPte;
v24 += 4096i64;
v8 = PointerPte;
if( ((unsigned __int16)PointerPte & 0xFFF) == 0 || PointerPte > LastPte )
{
MiUnlockPageTableInternal(p_Vm, v35);
v9 = v36;
v10 = v38;
if( PointerPte > LastPte )
goto LABEL_54;
goto LABEL_3;
}
}
}
if( v21 )
MiUnlockPageTableInternal(p_Vm, v21);
LABEL_54:
v7 = v33;
LABEL_55:
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)p_Vm, v7);
return v6;
}Referenced by:
MiDeletePartialVad
MiPrepareImagePagesForHotPatch
MiSetProtectionOnSection