MiCreateSystemPageTable
INT64 __fastcall MiCreateSystemPageTable(INT64 a1, UINT64 a2, INT64 a3){
__int64 v3;
__int64 v5;
INT64 v7;
__int16 v8;
INT64 v9;
int PageTablePages;
__int64 v12;
_MMPTE *PteBase;
int v14;
void *v15;
void *v16;
UINT64 v17;
__int64 v18;
INT64 v19;
v3 = *(_QWORD *)(a1 + 168);
v18 = 0i64;
v5 = (int)a3;
v7 = MI_READ_PTE_LOCK_FREE(a2);
v19 = v7;
v8 = v7;
v9 = v7 & 1;
if( (v7 & 1) != 0
&& ((v7 & 0x80) != 0
|| (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v19) >> 12) & 0xFFFFFFFFFi64) != *(_QWORD *)&MiState[8 * v5 + 9480]
&& (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v19) >> 12) & 0xFFFFFFFFFi64) != *(_QWORD *)&MiState[8 * v5 + 9448]
&& ((v8 & 0x800) != 0 || (v8 & 0x42) != 0))
|| (*(_DWORD *)(v3 + 64) & 0x80) != 0
&& (unsigned int)MiMakeLargePageTable(a1, (volatile INT64 *)a2, (unsigned int)v5) )
{
return 0i64;
}
PageTablePages = MiGetPageTablePages(v3, 1ui64, &v18);
if( PageTablePages < 0 )
{
if( PageTablePages == -1073741801
&& (*(_BYTE *)a1 & 2) != 0
&& *(_BYTE *)(a1 + 6) < 2u
&& *((char *)KeGetCurrentThread() + 195) < 16
&& (*(_DWORD *)(v3 + 64) & 0x400) == 0 )
{
return 2i64;
}
else
{
*(_DWORD *)(v3 + 264) = PageTablePages;
return 4i64;
}
}
else
{
++*(_QWORD *)(v3 + 48);
v12 = (v18 - (__int64)MmGetPfnDb()) / 48;
if( (MiFlags & 0x80) != 0 && (++dword_140C4E50C & MmPageValidationFrequency) == 0 )
MiArePageContentsZero((PVOID)v12);
PteBase = MmGetPteBase();
if( v9 )
{
if( *((_QWORD *)KeGetCurrentPrcb() + 4160) )
{
LODWORD(v15) = MiMapPageInHyperSpaceWorker(v12, 0i64, 0x80000000ui64);
v16 = v15;
KeCopyPage(v15);
MiUnmapPageInHyperSpaceWorker(v16, 0x11u, 0x80000000ui64);
PteBase = MmGetPteBase();
}
else
{
MxCopyPage(v12, (PVOID)((__int64)((a2 << 25) - ((_QWORD)PteBase << 25)) >> 16));
}
}
MiInitializeSystemPageTable((_MMPTE *)v3, (_MMPFN *)(unsigned int)v5);
v14 = 3;
if( (_DWORD)v5 == 3 && *(_DWORD *)(v3 + 56) != 2 )
{
v17 = a2;
do
{
v17 = (__int64)((v17 << 25) - ((_QWORD)PteBase << 25)) >> 16;
--v14;
}
while( v14 );
MiReplicatePteChange((MMPTE *)v17, (MMPTE *)v17);
}
if( (int)v5 <= ((*(unsigned __int8 *)(a1 + 2) >> 2) & 7) )
{
if( (int)v5 > 1 )
MiMakeSystemLeavesNonZero(a1, a2, (unsigned int)v5);
return 0i64;
}
if( v9 )
MiFlushTbList(v3 + 80);
return 1i64;
}
}Referenced by:
No references.