MiCountSharedPages
INT64 __fastcall MiCountSharedPages(INT64 a1, UINT64 a2, UINT64 a3){
INT64 v6;
UINT8 v7;
UINT64 v8;
__int64 v9;
__int64 v10;
unsigned __int64 v11;
UINT64 LeafVa;
CHAR *AnyMultiplexedVm;
int v14;
UINT8 v15;
WCHAR *v16;
_MMPTE *PteBase;
UINT64 v18;
UINT64 v19;
UINT64 v20;
int v21;
int v22;
_MMPTE *Pml4eBase;
unsigned __int64 v24;
signed __int64 v25;
UNICODE_STRING *PxeUserLimit;
int v27;
UNICODE_STRING *v28;
int v29;
int v30;
UINT8 v32;
INT64 v33;
UINT64 v34;
__int64 v35;
__int128 v36;
_SUBSECTION *ContainingSubsection;
__int64 v38;
__int16 v39;
_BYTE v40[14];
__int64 v41;
CHAR *v42;
unsigned __int64 v43;
__int64 v44;
INT64(__fastcall *v45)(INT64);
__int128 *v46;
v6 = 0i64;
v33 = *((_QWORD *)KeGetCurrentThread() + 23) + 1664i64;
v7 = MiLockWorkingSetShared(v33);
v32 = v7;
if( a2 > a3 )
goto LABEL_55;
v8 = a2;
v9 = (_QWORD)MmGetPteBase() << 25;
v35 = v9;
v10 = (__int64)((a3 << 25) - v9) >> 16;
v38 = v10;
LABEL_3:
v36 = 0i64;
memset((INT64)v40, 0i64);
v39 = 2145;
v11 = (__int64)((v8 << 25) - v9) >> 16;
LeafVa = MiGetLeafVa(v11);
if( LeafVa < 0xFFFF800000000000ui64 || LeafVa >= qword_140C4F878 && LeafVa <= qword_140C4E0A8 )
AnyMultiplexedVm = (CHAR *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1664i64);
else
AnyMultiplexedVm = MiGetAnyMultiplexedVm(1i64);
v14 = MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, v11);
if( v14 )
{
LODWORD(v36) = v14 - 1;
PteBase = MmGetPteBase();
v18 = (UINT64)PteBase + ((v11 >> 9) & 0x7FFFFFFFF8i64);
*((_QWORD *)&v36 + 1) = v18;
}
else
{
v39 |= 4u;
v46 = &v36;
v41 = 0i64;
v42 = AnyMultiplexedVm;
v40[0] = v40[0] & 0xE3 | 4;
v45 = MiGetNextPageTableTail;
v40[4] = v32;
v43 = v11;
v44 = v10;
MiWalkPageTables((INT64)&v39);
v18 = *((_QWORD *)&v36 + 1);
PteBase = MmGetPteBase();
}
if( v18 )
{
v20 = (UINT64)PteBase + ((v18 >> 9) & 0x7FFFFFFFF8i64);
v19 = a3 + 8;
}
else
{
v19 = a3 + 8;
v20 = 0i64;
v18 = a3 + 8;
}
v21 = *(_DWORD *)(a1 + 48) >> 7;
v34 = v20;
if( (*(_DWORD *)(a1 + 48) & 0x70) != 32 || (v21 & 0x1F) == 1 )
{
if( (v21 & 5) != 5 )
v6 += (__int64)(v18 - a2) >> 3;
a2 = v18;
}
else
{
for( ; a2 < v18; a2 += 8i64 )
{
MiPteNeedsCommitCharge((_MMVAD *)a1, (_MMPTE *)a2);
if( v22 == 1 )
++v6;
}
}
if( a2 != v19 )
{
Pml4eBase = MmGetPml4eBase();
v24 = (__int64)((a2 << 25) - v35) >> 16;
while( 1 )
{
v25 = *(_QWORD *)a2;
PxeUserLimit = (UNICODE_STRING *)MmGetPxeUserLimit();
if( a2 >= (unsigned __int64)Pml4eBase && a2 <= (unsigned __int64)PxeUserLimit )
PxeUserLimit = (UNICODE_STRING *)MmGetPxeUserLimit();
if( v25 )
{
if( (v25 & 1) != 0 )
{
if( (v25 & 0x200) != 0 )
goto LABEL_48;
v28 = (UNICODE_STRING *)((char *)MmGetPfnDb() + 48 * (((unsigned __int64)v25 >> 12) & 0xFFFFFFFFFi64));
LOBYTE(v29) = MI_PFN_IS_PROTO(v28, PxeUserLimit, v15, v16);
if( !v29
|| (_MMPTE *)((unsigned __int64)v28->Buffer | 0x8000000000000000ui64) != MiGetProtoPteAddress(
(_MMVAD *)a1,
v24 >> 12,
0i64,
&ContainingSubsection) )
{
goto LABEL_48;
}
}
else
{
if( (v25 & 0x400) == 0 )
goto LABEL_48;
if( MiIsPrototypePteVadLookup(v25) )
{
if( (v25 & 0xA0) == 0xA0 )
goto LABEL_48;
}
else
{
if( qword_140C4DC80 && (v25 & 0x10) == 0 )
v25 &= ~qword_140C4DC80;
if( (_MMPTE *)(v25 >> 16) != MiGetProtoPteAddress((_MMVAD *)a1, v24 >> 12, 0i64, &ContainingSubsection) )
goto LABEL_48;
if( (*(_DWORD *)(a1 + 48) & 0x70) == 32 )
{
MiPteNeedsCommitCharge((_MMVAD *)a1, (_MMPTE *)a2);
if( v30 != 1 )
goto LABEL_48;
}
}
}
}
else
{
MiPteNeedsCommitCharge((_MMVAD *)a1, (_MMPTE *)a2);
if( v27 != 1 )
goto LABEL_48;
}
++v6;
LABEL_48:
a2 += 8i64;
v24 += 4096i64;
v8 = a2;
if( (a2 & 0xFFF) == 0 || a2 > a3 )
{
MiUnlockPageTableInternal(v33, v34);
v9 = v35;
v10 = v38;
if( a2 > a3 )
goto LABEL_54;
goto LABEL_3;
}
}
}
if( v20 )
MiUnlockPageTableInternal(v33, v20);
LABEL_54:
v7 = v32;
LABEL_55:
MiUnlockWorkingSetShared(v33, v7);
return v6;
}Referenced by:
MiDeletePartialVad
MiPrepareImagePagesForHotPatch
MiSetProtectionOnSection