MiInitializeDynamicPfns
VOID __stdcall MiInitializeDynamicPfns(UINT64 StartPage, UINT64 NumberOfPages, UINT16 PartitionId, UINT64 Flags){
unsigned __int16 *v4;
unsigned int v7;
_MMPFN *v8;
char v9;
int v10;
unsigned __int8 v11;
unsigned __int64 v12;
unsigned int v13;
INT64 v14;
_MMPTE *v15;
UINT8 v16;
ULONG_PTR v17;
unsigned __int64 v18;
unsigned __int64 v19;
_MMPFN *v20;
__int64 v21;
int v22;
char v23;
_MMPFN *v24;
int v25;
UINT8 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];
unsigned __int16 v38;
int v39;
INT64 v40;
__int64 v41;
INT64 v42;
_LIST_ENTRY v43;
__int128 v44;
__int128 v45;
_LIST_ENTRY v46;
__int128 v47;
__int128 v48;
INT64 v49[48];
__int64 v50;
INT64 v51;
v4 = (unsigned __int16 *)PartitionId;
v41 = v50;
v42 = PartitionId;
v40 = v51;
v7 = Flags;
v46 = 0i64;
v47 = 0i64;
v48 = 0i64;
v43 = 0i64;
v44 = 0i64;
v45 = 0i64;
memset(v49, 0i64, sizeof(v49));
v38 = *v4;
v8 = &MmGetPfnDb()[StartPage];
v9 = 5;
v10 = v7 & 6;
v39 = v10;
if( v10 == 4 )
{
v11 = ExAcquireSpinLockExclusive((INT64 *)&stru_140C50B28 + 12);
*(&stru_140C50B28 + 853) += NumberOfPages;
v12 = v11;
byte_140C50ACC = 1;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&stru_140C50B28 + 12);
__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(&Irp.Core.PartitionId, StartPage, NumberOfPages, v14, 1, v35, v36);
}
if( (v13 & 2) != 0 )
{
v15 = *(_MMPTE **)(v50 + 8);
MiReferenceControlAreaPfn(**(_CONTROL_AREA ***)v50, *(_SUBSECTION **)v50, (unsigned int)NumberOfPages);
}
else
{
v15 = 0i64;
}
v16 = 17;
v17 = 0;
PageIrql[0] = 17;
while( NumberOfPages )
{
MiRestrictRangeToNode(StartPage, NumberOfPages);
v19 = v18;
if( v41 )
{
if( v18 > (unsigned __int64)(4096 - ((unsigned __int16)v15 & 0xFFFu)) >> 3 )
v19 = (unsigned __int64)(4096 - ((unsigned __int16)v15 & 0xFFFu)) >> 3;
while( 1 )
{
v20 = MiLockProtoPoolPage(v15, (UINT8 *)PageIrql);
v17 = (unsigned int)v20;
if( v20 )
break;
MmAccessFault(2ui64, v15, 0, 0i64);
}
MiInitializeUnusablePfns(&MmGetPfnDb()[StartPage], v19, v38, v13);
v16 = PageIrql[0];
}
else
{
LODWORD(v21) = MiSearchNumaNodeTable((PVOID)StartPage);
MiInitializeDpcGang((INT64)v49, *(unsigned int *)(v21 + 8), 1);
v49[21] = v42;
v22 = LODWORD(v49[23]) | 4;
HIDWORD(v49[22]) = v13;
v49[0] = StartPage;
v49[1] = v19;
v49[20] = v40;
if( v40 )
v22 = LODWORD(v49[23]) | 0xC;
LODWORD(v49[23]) = v22 | 2;
MiStartDpcGang((UINT64 *)v49);
}
if( v15 )
{
MiUnlockProtoPoolPage(v17, v16);
v15 += v19;
}
NumberOfPages -= v19;
StartPage += v19;
v40 += v19 << 12;
}
}
else
{
if( (v7 & 2) == 0 )
{
LODWORD(v34) = 0;
MiUpdateLargePageBitMap((UINT64)&Irp, StartPage, NumberOfPages, 0i64, v34);
}
*((_QWORD *)&v47 + 1) |= 0x8000000000000000ui64;
*((_QWORD *)&v44 + 1) |= 0x8000000000000000ui64;
v23 = v9 | BYTE2(v45) & 0xF8;
v24 = &v8[NumberOfPages];
BYTE2(v45) = v23;
if( v8 < v24 )
{
v25 = v7 & 0x10;
do
{
v26 = MiLockPageInline(v8);
v27 = (*((_BYTE *)&v8->u3 + 3) & 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)((unsigned __int64)v8->u4._bf_0 >> 39) << 39);
v8->ListEntry = v43;
*((_QWORD *)&v45 + 1) = v30 & 0x1FF8000000000i64 ^ v29;
v31 = v45;
*((_OWORD *)&v8->3 + 1) = v28;
*(_OWORD *)&v8->u3.ReferenceCount = v31;
MiAbortCombineScan(v8);
if( v25 )
{
v32 = v47;
v8->ListEntry = v46;
v33 = v48;
*((_OWORD *)&v8->3 + 1) = v32;
*(_OWORD *)&v8->u3.ReferenceCount = v33;
}
_InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8((unsigned __int8)PageIrql[0]);
++v8;
}
while( v8 < v24 );
}
}
}Referenced by:
MiMapNewPfns
MiRemovePhysicalMemory