MmManagePartitionMemoryInformation
NTSTATUS __stdcall MmManagePartitionMemoryInformation(UINT16 **a1, INT64 a2){
_MI_PARTITION *v2;
unsigned int v4;
__int64 v5;
__int128 v6;
__int128 v7;
__int128 v8;
__int128 v9;
__int128 v10;
__int128 v11;
__int128 v12;
unsigned __int64 v13;
unsigned __int64 v14;
unsigned int v15;
unsigned int v16;
__int64 v17;
__int64 v18;
__int64 v19;
unsigned __int64 v20;
unsigned __int64 *p_TotalPagesEntireNode;
char *v22;
__int64 v23;
unsigned __int64 v24;
_QWORD *v25;
__int64 v26;
unsigned __int64 v27;
unsigned __int64 v29;
unsigned __int64 v30[22];
char v31[24];
char v32;
v2 = (_MI_PARTITION *)*a1;
v29 = 0i64;
memset(v30, 0i64, sizeof(v30));
if( *(_DWORD *)a2 )
return -1073741811;
v4 = *(_DWORD *)(a2 + 4);
if( v4 != -1 && v4 >= (unsigned __int16)KeNumberNodes )
return -1073741811;
if( *(_DWORD *)(a2 + 8) != -1 )
return -1073741811;
do
{
if( v4 == -1 )
{
*(_DWORD *)(a2 + 12) = (unsigned __int16)KeNumberNodes;
*(_QWORD *)(a2 + 16) = v2->Vp.ResidentAvailablePages;
v5 = 0i64;
*(_QWORD *)(a2 + 24) = v2->Vp.TotalCommittedPages;
*(_QWORD *)(a2 + 32) = v2->Vp.TotalCommitLimit;
*(_QWORD *)(a2 + 40) = v2->Commit.PeakCommitment;
if( v2 == &Irp )
v5 = *(&stru_140C4DB30 + 268);
*(_QWORD *)(a2 + 224) = v5;
MiQueryMemoryListInformation(v2, v30);
v6 = *(_OWORD *)&v30[7];
*(_OWORD *)(a2 + 88) = *(_OWORD *)&v30[5];
v7 = *(_OWORD *)&v30[9];
*(_OWORD *)(a2 + 104) = v6;
v8 = *(_OWORD *)&v30[11];
*(_OWORD *)(a2 + 120) = v7;
v9 = *(_OWORD *)&v30[13];
*(_OWORD *)(a2 + 136) = v8;
v10 = *(_OWORD *)&v30[15];
*(_OWORD *)(a2 + 152) = v9;
v11 = *(_OWORD *)&v30[17];
*(_OWORD *)(a2 + 168) = v10;
v12 = *(_OWORD *)&v30[19];
*(_OWORD *)(a2 + 184) = v11;
*(_OWORD *)(a2 + 200) = v12;
*(_QWORD *)(a2 + 216) = v2->Commit.TotalCommitLimitMaximum;
v13 = *(_QWORD *)(a2 + 32);
if( v13 > *(_QWORD *)(a2 + 216) )
*(_QWORD *)(a2 + 216) = v13;
v14 = *(_QWORD *)(a2 + 24);
if( *(_QWORD *)(a2 + 40) < v14 )
*(_QWORD *)(a2 + 40) = v14;
if( v14 > v13 )
*(_QWORD *)(a2 + 24) = v13;
v15 = (unsigned __int16)KeNumberNodes;
v16 = 0;
}
else
{
*(_DWORD *)(a2 + 12) = 0;
*(_QWORD *)(a2 + 16) = 0i64;
*(_QWORD *)(a2 + 24) = 0i64;
*(_QWORD *)(a2 + 32) = 0i64;
*(_QWORD *)(a2 + 40) = 0i64;
*(_QWORD *)(a2 + 216) = 0i64;
*(_QWORD *)(a2 + 224) = 0i64;
memset((VOID *)(a2 + 88), 0i64, 0x40u);
memset((VOID *)(a2 + 152), 0i64, 0x40u);
v16 = *(_DWORD *)(a2 + 4);
v15 = v16 + 1;
}
v17 = 0i64;
*(_QWORD *)(a2 + 64) = 0i64;
v18 = 0i64;
*(_QWORD *)(a2 + 72) = 0i64;
v19 = 0i64;
*(_QWORD *)(a2 + 80) = 0i64;
v20 = 0i64;
*(_QWORD *)(a2 + 48) = 0i64;
if( v16 < v15 )
{
p_TotalPagesEntireNode = &v2->Core.NodeInformation[v16].TotalPagesEntireNode;
do
{
MiGetChannelInformation(v2, v16, (__int64)v31, &v29);
v19 = *(_QWORD *)(a2 + 64);
v18 = *(_QWORD *)(a2 + 72);
v17 = *(_QWORD *)(a2 + 80);
if( (unsigned int)(v29 / 0x28) )
{
v22 = &v32;
v23 = (unsigned int)(v29 / 0x28);
do
{
v19 += *((_QWORD *)v22 - 1);
v18 += *(_QWORD *)v22;
v17 += *((_QWORD *)v22 + 1);
v22 += 40;
--v23;
}
while( v23 );
}
*(_QWORD *)(a2 + 64) = v19;
++v16;
*(_QWORD *)(a2 + 72) = v18;
*(_QWORD *)(a2 + 80) = v17;
v24 = *p_TotalPagesEntireNode;
p_TotalPagesEntireNode += 568;
v20 = *(_QWORD *)(a2 + 48) + v24;
*(_QWORD *)(a2 + 48) = v20;
}
while( v16 < v15 );
}
v4 = *(_DWORD *)(a2 + 4);
if( v4 == -1 )
{
*(_QWORD *)(a2 + 80) = 0i64;
v17 = 0i64;
v25 = (_QWORD *)(a2 + 88);
v26 = 8i64;
do
{
v17 += *v25++;
*(_QWORD *)(a2 + 80) = v17;
--v26;
}
while( v26 );
v18 = *(_QWORD *)(a2 + 72);
v19 = *(_QWORD *)(a2 + 64);
v20 = *(_QWORD *)(a2 + 48);
}
v27 = v17 + v19 + v18;
*(_QWORD *)(a2 + 56) = v27;
}
while( v27 > v20 );
*(_DWORD *)(a2 + 232) = v2->Core.PartitionId;
return 0;
}Referenced by:
NtManagePartition
VfNotifyDifPlugins
VfUtilGetAvailableSystemPages