MiInitializeDynamicPfns
VOID __stdcall MiInitializeDynamicPfns(UINT64 StartPage, UINT64 NumberOfPages, UINT16 PartitionId, UINT64 Flags){
UINT16 *v4;
unsigned int v7;
char *v8;
char v9;
int v10;
KIRQL v11;
unsigned __int64 v12;
unsigned int v13;
INT64 v14;
UINT64 v15;
char v16;
_MMPFN *v17;
unsigned __int64 v18;
unsigned __int64 v19;
UINT64 v20;
__int64 v21;
int v22;
char v23;
char *v24;
int v25;
char v26;
bool v27;
__int128 v28;
__int64 v29;
unsigned __int64 v30;
__int128 v31;
__int128 v32;
__int128 v33;
UINT64 v34;
INT64 v35;
INT64 v36;
char PageIrql[2];
UINT16 v38;
int v39;
INT64 v40;
__int64 v41;
INT64 v42;
__int128 v43;
__int128 v44;
__int128 v45;
__int128 v46;
__int128 v47;
__int128 v48;
INT64 result[22];
unsigned int v50;
int v51;
__int64 v52;
__int64 v53;
v4 = (UINT16 *)PartitionId;
v41 = v52;
v42 = PartitionId;
v40 = v53;
v7 = Flags;
v46 = 0i64;
v47 = 0i64;
v48 = 0i64;
v43 = 0i64;
v44 = 0i64;
v45 = 0i64;
memset((INT64)result, 0i64);
v38 = *v4;
v8 = (char *)MmGetPfnDb() + 48 * StartPage;
v9 = 5;
v10 = v7 & 6;
v39 = v10;
if( v10 == 4 )
{
v11 = ExAcquireSpinLockExclusive(&dword_140C50B88);
qword_140C525D0 += NumberOfPages;
v12 = v11;
byte_140C50ACC = 1;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C50B88);
__writecr8(v12);
v10 = v39;
v9 = 6;
}
if( (v7 & 1) != 0 )
{
v13 = v7 | 0x40;
if( v10 != 4 )
v13 = v7;
if( (v13 & 0x1800) != 0 )
{
LODWORD(v36) = 0;
LODWORD(v35) = MiDetermineNewPfnHeatState(0i64) == 0;
MiInitializeAllResidentPageBasePfns((UINT16 *)&MiSystemPartition, StartPage, NumberOfPages, v14, 1, v35, v36);
}
if( (v13 & 2) != 0 )
{
v15 = *(_QWORD *)(v52 + 8);
MiReferenceControlAreaPfn(**(_CONTROL_AREA ***)v52, *(_SUBSECTION **)v52, (unsigned int)NumberOfPages);
}
else
{
v15 = 0i64;
}
v16 = 17;
v17 = 0i64;
PageIrql[0] = 17;
while( NumberOfPages )
{
MiRestrictRangeToNode(StartPage, NumberOfPages);
v19 = v18;
if( v41 )
{
if( v18 > (unsigned __int64)(4096 - (unsigned int)(v15 & 0xFFF)) >> 3 )
v19 = (unsigned __int64)(4096 - (unsigned int)(v15 & 0xFFF)) >> 3;
while( 1 )
{
v17 = MiLockProtoPoolPage((_MMPTE *)v15, (UINT8 *)PageIrql);
if( v17 )
break;
MmAccessFault(2ui64, (PVOID)v15, 0, 0i64);
}
MiInitializeUnusablePfns(
(__m128i *)MmGetPfnDb() + 3 * StartPage,
v19,
v38,
v13,
*(_QWORD *)v41,
v15,
*(_DWORD *)(v41 + 16));
v16 = PageIrql[0];
}
else
{
LODWORD(v21) = MiSearchNumaNodeTable((PVOID)StartPage);
MiInitializeDpcGang((INT64)result, *(unsigned int *)(v21 + 8), 1);
result[21] = v42;
v22 = v51 | 4;
v50 = v13;
result[0] = StartPage;
result[1] = v19;
result[20] = v40;
if( v40 )
v22 = v51 | 0xC;
v51 = v22 | 2;
MiStartDpcGang((UINT64 *)result);
}
if( v15 )
{
LOBYTE(v20) = v16;
MiUnlockProtoPoolPage(v17, v20);
v15 += 8 * v19;
}
NumberOfPages -= v19;
StartPage += v19;
v40 += v19 << 12;
}
}
else
{
if( (v7 & 2) == 0 )
{
LODWORD(v34) = 0;
MiUpdateLargePageBitMap((UINT64)&MiSystemPartition, StartPage, NumberOfPages, 0i64, v34);
}
*((_QWORD *)&v47 + 1) |= 0x8000000000000000ui64;
*((_QWORD *)&v44 + 1) |= 0x8000000000000000ui64;
v23 = v9 | BYTE2(v45) & 0xF8;
v24 = &v8[48 * NumberOfPages];
BYTE2(v45) = v23;
if( v8 < v24 )
{
v25 = v7 & 0x10;
do
{
v26 = MiLockPageInline((INT64)v8);
v27 = (v8[35] & 0x40) == 0;
PageIrql[0] = v26;
if( !v27 )
MiSetPfnRemovalRequested((INT64)v8, 0i64);
v28 = v44;
v29 = *((_QWORD *)&v45 + 1);
v30 = *((_QWORD *)&v45 + 1) ^ ((unsigned __int64)(unsigned __int16)(*((_QWORD *)v8 + 5) >> 39) << 39);
*(_OWORD *)v8 = v43;
*((_QWORD *)&v45 + 1) = v30 & 0x1FF8000000000i64 ^ v29;
v31 = v45;
*((_OWORD *)v8 + 1) = v28;
*((_OWORD *)v8 + 2) = v31;
MiAbortCombineScan((INT64)v8);
if( v25 )
{
v32 = v47;
*(_OWORD *)v8 = v46;
v33 = v48;
*((_OWORD *)v8 + 1) = v32;
*((_OWORD *)v8 + 2) = v33;
}
_InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8((unsigned __int8)PageIrql[0]);
v8 += 48;
}
while( v8 < v24 );
}
}
}Referenced by:
MiMapNewPfns
MiRemovePhysicalMemory