MiCreateSystemPageTable
NTSTATUS __stdcall MiCreateSystemPageTable(INT64 a1, UINT64 a2, INT64 a3){
__int64 v3;
__int64 v5;
INT64 v7;
_MI_SYSTEM_VA_TYPE v8;
__int16 v9;
INT64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
int v14;
__int64 v15;
_MMPTE *PteBase;
int v17;
void *v18;
UINT64 v19;
UINT64 PageTableCount;
INT64 v21;
v3 = *(_QWORD *)(a1 + 168);
PageTableCount = 0i64;
v5 = (int)a3;
LODWORD(v7) = MI_READ_PTE_LOCK_FREE(a2);
v21 = v7;
v9 = v7;
v10 = v7 & 1;
if( (v7 & 1) != 0 )
{
if( (v7 & 0x80) != 0 )
return 0;
LODWORD(v11) = MI_READ_PTE_LOCK_FREE((INT64)&v21);
if( ((v11 >> 12) & 0xFFFFFFFFFi64) != MiState[v5 + 1185] )
{
LODWORD(v12) = MI_READ_PTE_LOCK_FREE((INT64)&v21);
if( ((v12 >> 12) & 0xFFFFFFFFFi64) != MiState[v5 + 1181] && ((v9 & 0x800) != 0 || (v9 & 0x42) != 0) )
return 0;
}
}
if( (*(_DWORD *)(v3 + 64) & 0x80) != 0 && MiMakeLargePageTable(a1, (INT64 *)a2, (unsigned int)v5) )
return 0;
MiGetPageTablePages((_MI_ZERO_PAGE_TABLE_CREATION *)v3, (VOID *)1, (UINT64)&PageTableCount, v8);
if( v14 < 0 )
{
if( v14 == -1073741801
&& (*(_BYTE *)a1 & 2) != 0
&& *(_BYTE *)(a1 + 6) < 2u
&& KeGetCurrentThread()->Priority < 16
&& (*(_DWORD *)(v3 + 64) & 0x400) == 0 )
{
return 2;
}
else
{
*(_DWORD *)(v3 + 264) = v14;
return 4;
}
}
else
{
++*(_QWORD *)(v3 + 48);
v15 = (__int64)(PageTableCount - (_QWORD)MmGetPfnDb()) / 48;
if( (MiFlags & 0x80) != 0 && (++*(&stru_140C4DB30 + 631) & MmPageValidationFrequency) == 0 )
MiArePageContentsZero((PVOID)v15);
PteBase = MmGetPteBase();
if( v10 )
{
if( KeGetCurrentPrcb()->HyperPte )
{
v18 = MiMapPageInHyperSpaceWorker(v15, 0i64, 0x80000000ui64);
KeCopyPage(v18);
MiUnmapPageInHyperSpaceWorker(v18, 0x11u, 0x80000000ui64);
PteBase = MmGetPteBase();
}
else
{
MxCopyPage();
}
}
MiInitializeSystemPageTable((_MMPTE *)v3, (_MMPFN *)(unsigned int)v5);
v17 = 3;
if( (_DWORD)v5 == 3 && *(_DWORD *)(v3 + 56) != 2 )
{
v19 = a2;
do
{
v19 = (__int64)((v19 << 25) - ((_QWORD)PteBase << 25)) >> 16;
--v17;
}
while( v17 );
MiReplicatePteChange((_MMPTE *)v19, (_MMPTE *)v19);
}
if( (int)v5 <= ((*(unsigned __int8 *)(a1 + 2) >> 2) & 7) )
{
if( (int)v5 > 1 )
MiMakeSystemLeavesNonZero(a1, a2, (unsigned int)v5);
return 0;
}
if( v10 )
MiFlushTbList((_MI_TB_FLUSH_LIST *)(v3 + 80));
return 1;
}
}Referenced by:
No references.