MiFillPhysicalPages
NTSTATUS __stdcall MiFillPhysicalPages(PVOID BugCheckParameter2){
__int64 v1;
unsigned __int64 v2;
_XSTATE_CONFIGURATION *v3;
unsigned __int64 v4;
__int64 v6;
void *HyperPte;
void *v8;
NTSTATUS result;
unsigned __int64 Phase0Mapping;
unsigned __int64 v11;
unsigned __int64 v12;
int v13;
unsigned __int64 Long;
int v15;
__int64 OldIrql;
OldIrql = v1;
LOBYTE(OldIrql) = 17;
v3 = 0i64;
v4 = v2;
v6 = 0i64;
HyperPte = KeGetCurrentPrcb()->HyperPte;
do
{
if( HyperPte )
{
v8 = MiMapPageInHyperSpaceWorker((UINT64)BugCheckParameter2, (UINT8 *)&OldIrql, 0x80000000ui64);
}
else
{
Phase0Mapping = (unsigned __int64)MxGetPhase0Mapping();
v8 = (void *)Phase0Mapping;
if( !Phase0Mapping )
KeBugCheckEx(0x1Au, (PVOID)0x3030305, BugCheckParameter2, 0i64, 0i64);
v3 = (_XSTATE_CONFIGURATION *)((char *)MmGetPteBase() + ((Phase0Mapping >> 9) & 0x7FFFFFFFF8i64));
LODWORD(v11) = MiMakeValidPte(v3, (INT64)BugCheckParameter2, 2684354564i64);
v12 = v11;
LOBYTE(v13) = MiPteInShadowRange((UINT64)v3);
if( v13 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v12 & 1) != 0 )
v12 |= 0x8000000000000000ui64;
v3->EnabledFeatures = v12;
}
if( v4 )
memset64(v8, v4, 0x200ui64);
else
KeZeroPages(v8, 0x1000ui64);
if( HyperPte )
{
MiUnmapPageInHyperSpaceWorker(v8, OldIrql, 0x80000000ui64);
}
else
{
Long = ZeroPte.u.Long;
LOBYTE(v15) = MiPteInShadowRange((UINT64)v3);
if( v15 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
v3->EnabledFeatures = Long;
result = KeFlushSingleTb((UINT64)v8, FlushKernel, 1i64);
}
++v6;
BugCheckParameter2 = (char *)BugCheckParameter2 + 1;
}
while( !v6 );
return result;
}Referenced by:
MiGetPoolPages
MiInitializeDummyPages
MiInitializeSystemPageTable
MiZeroPhysicalPage
MxMapVa