MiInitializeShadowPageTable
void __fastcall MiInitializeShadowPageTable(__int64 a1, char *a2, int a3){
_MMPTE *PteBase;
__int64 v5;
__int64 v6;
UINT64 v7;
__int64 v8;
unsigned __int64 PteShadow;
int v10;
signed __int64 v11;
int v12;
int v13;
_MMPTE *v14;
int v15;
unsigned __int64 v16;
int v17;
UINT64 v18;
__int64 v19;
unsigned __int64 v20;
_MMPTE *PteAddress;
int v22;
__int64 v23;
signed __int64 v24;
__int64 v25;
UINT64 v26;
PteBase = MmGetPteBase();
v5 = a1;
if( a3 )
{
*(_QWORD *)a2 = 0i64;
v13 = 6;
v12 = 3;
v11 = (a2 - (char *)MmGetPfnDb()) / 48;
if( a3 == 3 )
{
v18 = -1i64;
goto LABEL_11;
}
}
else
{
v6 = ((a1 << 25) - ((_QWORD)PteBase << 25)) >> 16;
if( MI_IS_PHYSICAL_ADDRESS((VOID *)v6) )
{
PteAddress = (_MMPTE *)v5;
do
PteAddress = MiGetPteAddress(PteAddress);
while( v22 != 1 );
LODWORD(v23) = MI_READ_PTE_LOCK_FREE((INT64)PteAddress);
v8 = v23;
LODWORD(v24) = MiVaToPfn((VOID *)v6);
v11 = v24;
}
else
{
LODWORD(v7) = MI_READ_PTE_LOCK_FREE(v5);
v26 = v7;
v8 = v7;
PteShadow = v7;
LOBYTE(v10) = MiPteInShadowRange((UINT64)&v26);
if( v10 )
PteShadow = MiReadPteShadow((__int64)&v26, v8);
v11 = (PteShadow >> 12) & 0xFFFFFFFFFi64;
}
v12 = 3;
v13 = ((v8 & 0x800) != 0 ? 4 : 1) | 2;
if( v8 < 0 )
v13 = (v8 & 0x800) != 0 ? 4 : 1;
}
v14 = MiGetPteAddress((VOID *)v5);
v26 = MiReadWriteAnyLevelShadowPte((unsigned __int64)v14, v15, 0, ZeroPte.u.Long);
v16 = v26;
LOBYTE(v17) = MiPteInShadowRange((UINT64)&v26);
if( v17 )
v16 = MiReadPteShadow((__int64)&v26, v16);
v18 = (v16 >> 12) & 0xFFFFFFFFFi64;
LABEL_11:
LODWORD(v19) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v5, v11, v13 | (a3 != 0 ? -1744830464 : -1879048192));
v20 = v19 & 0xFFFFFFFFFFFFFEFFui64;
if( a3 )
{
if( a3 == 3 )
v18 = PsInitialSystemProcess->Pcb.DirectoryTableBase >> 12;
MiInitializePfnForOtherProcess(v11, (_MMPTE *)v5, v18, 0xA00ui64);
}
MiReadWriteAnyLevelShadowPte(v5, a3, 1, v20);
if( a3 == 3 )
{
MiMarkPxeAsShadowed(v5);
v25 = (_QWORD)MmGetPteBase() << 25;
do
{
v5 = ((v5 << 25) - v25) >> 16;
--v12;
}
while( v12 );
MiReplicatePteChange((_MMPTE *)v5, (_MMPTE *)v5);
}
}Referenced by:
MiMakeShadowPageTableRange