MiInitializeGapFrames
UINT64 __stdcall MiInitializeGapFrames(UINT64 Pattern, UINT64 *GapFrames){
INT64 v3;
INT64 v4;
unsigned int v5;
UINT64 *v6;
UINT64 Page;
char *v8;
unsigned __int64 v9;
UINT64 v10;
INT64 v11;
__int64 v12;
if( Pattern )
{
if( Pattern != -1i64 )
return 0i64;
v3 = qword_140C4EAA8;
}
else
{
v3 = qword_140C4EAC0;
}
v4 = MiReservePtes((INT64)&qword_140C4EC80, 3ui64);
if( !v4 || (MiAcquireNonPagedResources((_MI_PARTITION *)&MiSystemPartition, 3ui64) & 0x80000000) != 0i64 )
return 0i64;
v5 = 0;
v6 = GapFrames;
do
{
if( v5 )
{
Page = MiGetPage((_MI_PARTITION *)&MiSystemPartition, v5, 0x208ui64);
v3 = Page;
if( Page == -1i64 )
return 0i64;
v8 = (char *)MmGetPfnDb() + 48 * Page;
*((_QWORD *)v8 + 5) &= ~0x8000000000000000ui64;
v9 = *((_QWORD *)v8 + 3) & 0xC000000000000001ui64;
*((_WORD *)v8 + 16) = 1;
*((_QWORD *)v8 + 3) = v9 | 1;
v10 = v4 + 8i64 * v5 - 8;
*(_QWORD *)v10 = MiMakeValidPte(v4 + 8i64 * v5, v3, 2684354564i64);
v11 = 536870913i64;
v12 = (__int64)((v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( v5 != 1 )
v11 = 2818572292i64;
if( v5 != 1 )
v10 = 0i64;
memset64((void *)v12, MiMakeValidPte(v10, GapFrames[v5 - 1], v11), 0x200ui64);
}
*v6 = v3;
++v5;
++v6;
}
while( v5 < 4 );
MiReleasePtes((INT64)&qword_140C4EC80, v4, 3ui64);
return 1i64;
}Referenced by:
MiFillPfnGaps
MiInitNucleus