MiFreePartitionTree
__int64 __fastcall MiFreePartitionTree(unsigned __int64 a1, unsigned __int64 *a2, char a3, int a4){
unsigned __int64 v4;
bool v5;
int v6;
_QWORD *v11;
_QWORD *v12;
v4 = *a2;
v5 = 0;
v6 = 0;
while( 1 )
{
if( !v4 )
return(unsigned int)v6;
RtlAvlRemoveNode(a2, (__int64 *)v4);
if( a4 == 1 )
{
v6 = MiFreePartitionNodePages(a1, v4, a3);
if( v6 < 0 )
break;
}
ExFreePoolWithTag(*(PVOID *)(v4 + 40), 0);
ExFreePoolWithTag((PVOID)v4, 0);
v4 = *a2;
}
v11 = (_QWORD *)*a2;
if( !*a2 )
goto LABEL_11;
while( (*(_QWORD *)(v4 + 24) & 0x7FFFFFFFFFFFFFFFui64) < (v11[3] & 0x7FFFFFFFFFFFFFFFui64) )
{
v12 = (_QWORD *)*v11;
if( !*v11 )
goto LABEL_11;
LABEL_14:
v11 = v12;
}
v12 = (_QWORD *)v11[1];
if( v12 )
goto LABEL_14;
v5 = 1;
LABEL_11:
RtlAvlInsertNodeEx(a2, (__int64)v11, v5, (_QWORD *)v4);
return(unsigned int)v6;
}Referenced by:
MiAllocatePartitionPhysicalPages
MiClearPartitionPageBitMap
MiHotAddPartitionMemory
MiInsertPartitionPages