MxCreateFreePfns
VOID __stdcall MxCreateFreePfns(_MEMORY_ALLOCATION_DESCRIPTOR *MemoryDescriptor){
unsigned __int64 BasePage;
unsigned __int64 PageCount;
int v3;
_TYPE_OF_MEMORY MemoryType;
__int64 v5;
_MMPFN *PfnDb;
_MMPFN *v7;
$559D8309DABD45803AD694472C7FC28A *v8;
unsigned __int16 ReferenceCount;
_QWORD *v10;
unsigned __int64 Long;
_MMPFN *v12;
int v13;
int v14;
__int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
unsigned int v18;
unsigned int i;
unsigned __int64 v20;
unsigned __int64 v21;
__int64 v22;
unsigned __int64 v23;
unsigned __int64 v24;
INT64 v25;
unsigned __int64 v26;
UINT8 v27;
NTSTATUS v28;
unsigned int v29;
unsigned int v30;
unsigned __int8 CurrentIrql;
unsigned __int64 v32;
_MMPFN *v33;
__m128i *v34;
INT64 v35;
UINT64 v36;
UINT64 v37;
INT64 v38;
INT64 v39;
INT64 v40;
_MMPFN *v41;
__int64 v42;
unsigned int v43;
_QWORD v44[3];
INT64 v45[2];
__int128 v46;
__int128 v47;
int v48;
unsigned __int64 v49;
unsigned __int8 v50;
_BOOL4 v51;
UINT64 SpinCount;
BasePage = MemoryDescriptor->BasePage;
PageCount = MemoryDescriptor->PageCount;
v3 = 0;
*(_OWORD *)v45 = 0i64;
v46 = 0i64;
v47 = 0i64;
if( !BasePage )
{
if( !--PageCount )
return;
BasePage = 1i64;
}
MemoryType = MemoryDescriptor->MemoryType;
if( MemoryType == LoaderFree || (v5 = 1i64, MemoryType == LoaderZero) )
v5 = 0i64;
v42 = v5;
PfnDb = MmGetPfnDb();
v51 = MemoryType != LoaderZero;
v7 = &PfnDb[BasePage];
v41 = 0i64;
v8 = 0i64;
if( !PageCount )
goto LABEL_48;
do
{
if( v5 )
{
ReferenceCount = v7->u3.ReferenceCount;
if( ReferenceCount == 1 )
{
v10 = (_QWORD *)(v7->PteLong | 0x8000000000000000ui64);
Long = ZeroPte.u.Long;
v12 = &PfnDb[v7->u4._bf_0 & 0xFFFFFFFFFi64];
v48 = v3;
LOBYTE(v13) = MiPteInShadowRange((UINT64)v10);
v3 = 0;
if( v13 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 )
{
v14 = v48;
if( (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
}
else
{
v14 = v48;
}
*v10 = Long;
if( v14 )
MiWritePteShadow();
v15 = v12->u2._bf_0 ^ ((v12->u2._bf_0 - 1) ^ v12->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
v12->u2._bf_0 = v15;
if( (v15 & 0x3FFFFFFFFFFFFFFFi64) == 1 )
{
MiFreeEmptyBootPageTable(v12);
v3 = 0;
}
v5 = v42;
v7->u3.ReferenceCount = v3;
v7->u2._bf_0 &= 0xC000000000000000ui64;
}
else if( ReferenceCount )
{
goto LABEL_46;
}
}
if( (BasePage & 0x1FF) != 0 || v5 || PageCount < 0x200 )
{
v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = (__int64)v8;
v8 = ($559D8309DABD45803AD694472C7FC28A *)v7;
v41 = v7;
LABEL_46:
++BasePage;
++v7;
--PageCount;
goto LABEL_47;
}
MiRestrictRangeToNode(BasePage, PageCount);
v49 = v16;
v17 = v16;
if( v16 < 0x200 )
{
v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = (__int64)v8;
++BasePage;
v8 = ($559D8309DABD45803AD694472C7FC28A *)v7;
v41 = v7++;
--PageCount;
goto LABEL_44;
}
v18 = (((unsigned __int64)KeFeatureBits >> 37) & 1) == 0;
v43 = v18;
for( i = v18; i <= 1; ++i )
{
v20 = MiLargePageSizes[i];
if( BasePage != (BasePage & ~(v20 - 1)) || v17 < v20 )
continue;
v21 = v17;
if( i == v18 )
{
v24 = v17;
}
else
{
v22 = MiLargePageSizes[i - 1];
v23 = v22 - (BasePage & (v22 - 1));
if( v23 <= v17 )
v21 = v23;
v24 = v21;
}
v25 = v21 - v24 % v20;
LODWORD(v40) = 0;
LODWORD(v38) = MiDetermineNewPfnHeatState(0i64) == 0;
MiInitializeAllResidentPageBasePfns(&Irp.Core.PartitionId, BasePage, v25, i, 1, v38, v40);
LODWORD(v39) = 0;
MiCreateInitialLargeLeafPfns(BasePage, v25, i, 1, 0, v39);
if( v25 )
{
v26 = v49;
do
{
v27 = MiLockPageInline(v7);
v44[1] = v51;
v44[0] = BasePage;
v44[2] = v27;
MiInsertLargePageInNodeList((__int64)v44);
v26 -= v20;
PageCount -= v20;
BasePage += v20;
v7 += v20;
v25 -= v20;
}
while( v25 );
v49 = v26;
v18 = v43;
}
v17 = v49;
if( v49 < 0x200 )
break;
i = v18 - 1;
}
v8 = ($559D8309DABD45803AD694472C7FC28A *)v41;
LABEL_44:
v3 = 0;
LABEL_47:
v5 = v42;
PfnDb = MmGetPfnDb();
}
while( PageCount );
LABEL_48:
v28 = MiDetermineNewPfnHeatState(0i64);
v30 = v29 | 0x400;
if( !v28 )
v30 = v29;
MiCreatePfnTemplate(v51, (INT64)v45);
CurrentIrql = KeGetCurrentIrql();
v50 = CurrentIrql;
__writecr8(v32);
if( v8 )
{
v33 = MmGetPfnDb();
do
{
v34 = (__m128i *)v8;
v8 = ($559D8309DABD45803AD694472C7FC28A *)v8->_bf_0;
MiCreateInitialPfns(v34, 1i64, (__m128i *)v45);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64(&v34[1].m128i_i32[2], 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v34[1].m128i_i64[1] < 0 );
}
MiInsertPageInFreeOrZeroedList(((char *)v34 - (char *)v33) / 48, v30, v35, v36, v37, v38);
_InterlockedAnd64(&v34[1].m128i_i64[1], 0x7FFFFFFFFFFFFFFFui64);
}
while( v8 );
CurrentIrql = v50;
}
__writecr8(CurrentIrql);
}Referenced by:
MiCreateFreePfns
MiSwitchToPfns
MxReleaseFreeDescriptor