MiInitializeGapFrames
NTSTATUS __stdcall MiInitializeGapFrames(UINT64 Pattern, UINT64 *GapFrames){
INT64 v3;
_MMPTE *v4;
_KTBFLUSH_TYPE v5;
int v6;
unsigned int v7;
UINT64 *v8;
INT64 v9;
_MMPFN *v10;
unsigned __int64 v11;
__int64 v12;
UINT64 v13;
__int64 v14;
int v15;
INT64 v16;
__int64 v17;
unsigned __int64 v18;
if( Pattern )
{
if( Pattern != -1i64 )
return 0;
v3 = *(&stru_140C4DB30 + 495);
}
else
{
v3 = *(&stru_140C4DB30 + 498);
}
v4 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 3ui64);
if( !v4 )
return 0;
MiAcquireNonPagedResources(&Irp, 3ui64);
if( v6 < 0 )
return 0;
v7 = 0;
v8 = GapFrames;
do
{
if( v7 )
{
LODWORD(v9) = MiGetPage((ULONG_PTR *)&Irp.Core.PartitionId, v7, 0x208ui64);
v3 = v9;
if( v9 == -1 )
return 0;
v10 = &MmGetPfnDb()[v9];
v10->u4._bf_0 &= ~0x8000000000000000ui64;
v11 = v10->u2._bf_0 & 0xC000000000000001ui64;
v10->u3.ReferenceCount = 1;
v10->u2._bf_0 = v11 | 1;
LODWORD(v12) = MiMakeValidPte((_XSTATE_CONFIGURATION *)&v4[v7], v3, 2684354564i64);
v13 = (UINT64)&v4[v7 - 1];
v14 = v12;
LOBYTE(v15) = MiPteInShadowRange(v13);
if( v15 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v14 & 1) != 0 )
v14 |= 0x8000000000000000ui64;
*(_QWORD *)v13 = v14;
v16 = 536870913i64;
v17 = (__int64)((v13 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( v7 != 1 )
v16 = 2818572292i64;
if( v7 != 1 )
v13 = 0i64;
LODWORD(v18) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v13, GapFrames[v7 - 1], v16);
memset64((void *)v17, v18, 0x200ui64);
}
*v8 = v3;
++v7;
++v8;
}
while( v7 < 4 );
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v4, 3ui64, v5);
return 1;
}Referenced by:
MiFillPfnGaps
MiInitNucleus