MiSwitchToPfns
VOID __fastcall MiSwitchToPfns(_LOADER_PARAMETER_BLOCK *LoaderBlock){
ULONG_PTR v2;
char *v3;
char *v4;
_MMPFN *PfnDb;
unsigned __int64 v6;
__int64 v7;
int v8;
unsigned __int64 v9;
__int64 v10;
__m128i *v11;
_MMPFN *v12;
unsigned __int128 v13;
__int64 v14;
INT64 v15;
INT64 v16;
UINT64 v17;
unsigned __int64 v18;
__int64 v19;
char v20;
_QWORD *v21;
__int128 v22;
__int128 v23;
INT64 v24;
char *v25;
char *v26;
v24 = 0i64;
v22 = 0i64;
v23 = 0i64;
v2 = MmPfnDatabase + 48 * qword_140C525C0;
if( !qword_140C525C0 && !*(_WORD *)(v2 + 32) )
{
v18 = (unsigned __int8)MiLockPageInline(MmPfnDatabase + 48 * qword_140C525C0);
*(_QWORD *)(v2 + 40) &= 0xFFFFFFF000000000ui64;
v19 = *(_QWORD *)(v2 + 24);
*(_QWORD *)(v2 + 8) = MmGetPteBase();
*(_WORD *)(v2 + 32) = 0;
v20 = *(_BYTE *)(v2 + 34) & 0xFD;
*(_QWORD *)(v2 + 24) = v19 & 0xC000000000000000ui64 | 1;
*(_BYTE *)(v2 + 34) = v20 | 5;
*(_BYTE *)(v2 + 34) = *(_BYTE *)(v2 + 34) & 0x3F | 0x40;
*(_QWORD *)(v2 + 40) |= 0x4000000000000ui64;
_InterlockedAnd64((volatile signed __int64 *)(v2 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v18);
}
v3 = (char *)LoaderBlock + 32;
v4 = (char *)*((_QWORD *)LoaderBlock + 4);
v25 = (char *)LoaderBlock + 32;
v26 = v4;
if( v4 != (char *)LoaderBlock + 32 )
{
PfnDb = MmGetPfnDb();
do
{
v6 = *((int *)v4 + 4);
v7 = *((_QWORD *)v4 + 4);
if( (v6 & 0x80000000) != 0i64 )
{
*((_DWORD *)v4 + 4) = v6 & 0x7FFFFFFF;
goto LABEL_26;
}
if( (v6 & 0x40000000) != 0
|| (unsigned int)v6 <= 0x18 && (v8 = 16777524, _bittest(&v8, v6))
|| (_DWORD)v6 == 29 && (MiFlags & 0x2000) == 0 )
{
MiCreateFreePfns((_MEMORY_ALLOCATION_DESCRIPTOR *)v4);
goto LABEL_26;
}
v9 = *((_QWORD *)v4 + 3);
if( !v9 )
{
if( !--v7 )
goto LABEL_26;
v9 = 1i64;
}
if( (unsigned int)v6 <= 0x22 )
{
v10 = 0x5C0800040i64;
if( _bittest64(&v10, v6) )
goto LABEL_25;
}
if( (_DWORD)v6 == 3 )
{
LABEL_48:
if( v9 <= HighestPhysicalPage && v9 + v7 > HighestPhysicalPage + 1 )
*((_QWORD *)v4 + 4) = HighestPhysicalPage - v9 + 1;
goto LABEL_26;
}
if( (_DWORD)v6 == 22 || (unsigned int)(v6 - 38) <= 2 )
goto LABEL_25;
v11 = (__m128i *)((char *)PfnDb + 48 * v9);
if( !v7 )
goto LABEL_24;
v12 = MmGetPfnDb();
do
{
v13 = RtlCompareMemoryUlong(v11, 48 * v7, 0) * (unsigned __int128)0xAAAAAAAAAAAAAAABui64;
if( !(*((_QWORD *)&v13 + 1) >> 5) )
{
if( (_DWORD)v6 != 29 && (_DWORD)v6 != 36 )
goto LABEL_21;
v21 = (_QWORD *)v11->m128i_i64[1];
if( (_DWORD)v6 == 29 )
{
if( v21 )
{
*v21 = 0i64;
v11->m128i_i64[1] = 0i64;
v21 = 0i64;
goto LABEL_45;
}
LABEL_47:
MiInitializeUnusablePfns(v11, 1i64, 0, 0x80ui64, 0i64, 0i64, 0);
}
else
{
LABEL_45:
if( !v21 )
goto LABEL_47;
MiMarkPfnVerified((UINT64)v11, 0);
}
LABEL_21:
--v7;
v14 = 48i64;
goto LABEL_22;
}
v9 = ((char *)v11 - (char *)v12) / 48;
MiRestrictRangeToNode(v9, *((_QWORD *)&v13 + 1) >> 5);
v16 = v15;
if( (((_DWORD)v6 - 9) & 0xFFFFFFFD) != 0 )
{
if( (_DWORD)v6 == 29 || (v17 = 64i64, (_DWORD)v6 == 36) )
v17 = 128i64;
MiInitializeUnusablePfns(v11, v15, 0, v17, 0i64, 0i64, 0);
}
else
{
LODWORD(v23) = 2;
*((_QWORD *)&v23 + 1) = ((char *)v11 - (char *)v12) / 48;
v24 = v15;
MxCreateFreePfns((__int64)&v22);
}
v7 -= v16;
v14 = 48 * v16;
LABEL_22:
v11 = (__m128i *)((char *)v11 + v14);
}
while( v7 );
v4 = v26;
PfnDb = MmGetPfnDb();
LABEL_24:
v3 = v25;
LABEL_25:
if( (_DWORD)v6 == 3 )
goto LABEL_48;
LABEL_26:
v4 = *(char **)v4;
v26 = v4;
}
while( v4 != v3 );
}
KeFlushTb(3i64, 2u);
MiFlags |= 0x8000000u;
}Referenced by:
MiInitNucleus