MiCreateFreePfns
VOID __fastcall MiCreateFreePfns(_MEMORY_ALLOCATION_DESCRIPTOR *CheckMd){
_TYPE_OF_MEMORY MemoryType;
__int64 v3;
unsigned __int64 BasePage;
unsigned __int64 PageCount;
__int64 *v6;
__int64 *v7;
_MEMORY_ALLOCATION_DESCRIPTOR *v8;
_LIST_ENTRY ListEntry;
unsigned int v10;
unsigned __int64 v11;
__int128 v12;
unsigned __int64 v13;
__int64 *v14;
INT64 *v15;
unsigned __int64 v16;
INT64 v17;
INT64 v18;
_LIST_ENTRY v19;
__int128 v20;
unsigned __int64 v21;
__int64 v22;
_LIST_ENTRY v23;
_OWORD v24[2];
__int64 v25;
__int64 Base[64];
memset((INT64)Base, 0i64);
MemoryType = CheckMd->MemoryType;
v3 = 0i64;
BasePage = CheckMd->BasePage;
PageCount = CheckMd->PageCount;
if( (MemoryType & 0x40000000) != 0 )
{
v6 = qword_140D5AD60;
CheckMd->MemoryType = MemoryType & 0xBFFFFFFF;
}
else
{
v6 = MxBootFreeDescriptor;
}
v7 = &v6[5 * (unsigned __int16)KeNumberNodes];
if( v6 >= v7 )
goto LABEL_10;
do
{
if( v6[1] && *v6 >= BasePage && *v6 < PageCount + BasePage )
{
Base[v3] = (__int64)v6;
v3 = (unsigned int)(v3 + 1);
}
v6 += 5;
}
while( v6 < v7 );
if( (_DWORD)v3 )
{
qsort((WCHAR *)Base, (unsigned int)v3, (const WCHAR *)8, MxDescriptorSort);
ListEntry = CheckMd->ListEntry;
v10 = 0;
v21 = CheckMd->PageCount;
v11 = v21;
v12 = *(_OWORD *)&CheckMd->MemoryType;
v23 = ListEntry;
v19 = ListEntry;
v20 = v12;
v13 = *((_QWORD *)&v12 + 1);
v14 = Base;
while( 1 )
{
v15 = (INT64 *)*v14;
v16 = *(_QWORD *)*v14;
if( v16 > v13 )
{
v22 = v16 - v13;
v25 = v16 - v13;
v24[0] = ListEntry;
v24[1] = v12;
MxCreateFreePfns((__int64)v24);
v11 -= v22;
v13 = *v15;
}
v17 = v15[1];
v18 = (unsigned int)CheckMd->MemoryType;
v11 -= v17;
v13 += v17;
v21 = v11;
*((_QWORD *)&v20 + 1) = v13;
MxReleaseFreeDescriptor(v15, v18);
if( !v11 )
break;
++v10;
++v14;
if( v10 >= (unsigned int)v3 )
{
v8 = (_MEMORY_ALLOCATION_DESCRIPTOR *)&v19;
goto LABEL_11;
}
v12 = v20;
ListEntry = v23;
}
}
else
{
LABEL_10:
v8 = CheckMd;
LABEL_11:
MxCreateFreePfns((__int64)v8);
}
}Referenced by:
MiSwitchToPfns