MiInitializeSystemPageTable
VOID __stdcall MiInitializeSystemPageTable(_MMPTE *PointerPte, _MMPFN *Pfn1){
INT64 v2;
char *v3;
char *v4;
UINT64 v5;
unsigned int v6;
unsigned int v7;
_MMPTE *PteBase;
__int64 v9;
unsigned __int64 v10;
_MMPTE *v11;
_MMPTE *PteLimit;
unsigned int v13;
UINT64 v14;
unsigned __int64 v15;
UINT64 v16;
unsigned __int64 v17;
UINT64 v18;
INT64 v19;
_MMPTE v20;
VOID *v21;
INT64 v22;
UINT64 v23;
unsigned __int64 v24;
int v25;
_KLOCK_QUEUE_HANDLE LockHandle;
_MI_TB_FLUSH_LIST *TbFlushList;
memset(&LockHandle, 0, sizeof(LockHandle));
v4 = v3;
v5 = v2;
v6 = (unsigned int)Pfn1;
v7 = 0;
MI_READ_PTE_LOCK_FREE(v2);
PteBase = MmGetPteBase();
v9 = (v4 - (char *)MmGetPfnDb()) / 48;
v10 = (__int64)((v5 << 25) - ((_QWORD)PteBase << 25)) >> 16;
v11 = PteBase;
PteLimit = MmGetPteLimit();
if( v10 < (unsigned __int64)v11 || v10 > (unsigned __int64)PteLimit )
{
MiFillPhysicalPages((PVOID)v9);
v13 = -1879048188;
}
else
{
v13 = -1879048186;
}
LODWORD(v14) = MiGetLeafVa(v5);
v15 = v14;
if( MiGetSystemRegionType(v14) == 1 )
{
v7 = 1;
}
else if( v15 <= 0x7FFFFFFEFFFFi64
|| v15 >= *(&stru_140C4DB30 + 937) && v15 <= *(&stru_140C4DB30 + 175)
|| v15 >= (unsigned __int64)MmGetPteBase() && v15 <= (unsigned __int64)MmGetPteLimit() )
{
v7 = 4;
}
*(_QWORD *)v4 = 0i64;
LODWORD(v16) = MiGetContainingPageTable(v5);
v18 = v16;
if( v10 >= (unsigned __int64)MmGetPteBase() && v10 <= v17 )
v13 |= 0x8000000u;
LODWORD(v19) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v5, v9, v13);
v22 = v19;
if( v6 == 3 && (MiFlags & 0x30) != 0 )
{
if( (v7 & 1) != 0 )
{
LODWORD(v23) = MiUpdateSessionPdeMaster(v21, v20);
v18 = v23;
}
else if( v7 < 4 )
{
if( PsInitialSystemProcess )
{
v18 = PsInitialSystemProcess->Pcb.DirectoryTableBase >> 12;
}
else
{
LODWORD(v24) = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v5 >> 9) & 0x7FFFFFFFF8i64));
v18 = (v24 >> 12) & 0xFFFFFFFFFi64;
}
}
}
MiInitializePfnForOtherProcess(v9, (_MMPTE *)v5, v18, 0x200ui64);
if( v6 == 3 )
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
if( (MI_READ_PTE_LOCK_FREE(v5) & 1) != 0 )
{
MiTransformValidPteInPlace((INT64 *)v5, v5, v22, v6);
if( v6 != 3 )
return;
MiInsertRecursiveTbFlushEntries(TbFlushList, 3i64, v5);
}
else
{
LOBYTE(v25) = MiPteInShadowRange(v5);
if( v25 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v22 & 1) != 0 )
v22 |= 0x8000000000000000ui64;
*(_QWORD *)v5 = v22;
}
if( v6 == 3 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
}Referenced by:
MiCreateSystemPageTable