MmManagePartitionMemoryInformation
INT64 __stdcall MmManagePartitionMemoryInformation(UINT16 **a1, INT64 a2){
ULONG_PTR *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;
__int64 *v21;
char *v22;
__int64 v23;
__int64 v24;
_QWORD *v25;
__int64 v26;
unsigned __int64 v27;
_QWORD a4[2];
INT64 result[5];
__int128 v31;
__int128 v32;
__int128 v33;
__int128 v34;
__int128 v35;
__int128 v36;
__int128 v37;
__int128 v38;
INT64 a3[3];
char v40;
v2 = (ULONG_PTR *)*a1;
a4[0] = 0i64;
memset((INT64)result, 0i64);
if( *(_DWORD *)a2 )
return 3221225485i64;
v4 = *(_DWORD *)(a2 + 4);
if( v4 != -1 && v4 >= (unsigned __int16)KeNumberNodes )
return 3221225485i64;
if( *(_DWORD *)(a2 + 8) != -1 )
return 3221225485i64;
do
{
if( v4 == -1 )
{
*(_DWORD *)(a2 + 12) = (unsigned __int16)KeNumberNodes;
*(_QWORD *)(a2 + 16) = v2[896];
v5 = 0i64;
*(_QWORD *)(a2 + 24) = v2[933];
*(_QWORD *)(a2 + 32) = v2[949];
*(_QWORD *)(a2 + 40) = v2[776];
if( v2 == &MiSystemPartition )
v5 = qword_140C4E390;
*(_QWORD *)(a2 + 224) = v5;
MiQueryMemoryListInformation(v2, (UINT64 *)result);
v6 = v32;
*(_OWORD *)(a2 + 88) = v31;
v7 = v33;
*(_OWORD *)(a2 + 104) = v6;
v8 = v34;
*(_OWORD *)(a2 + 120) = v7;
v9 = v35;
*(_OWORD *)(a2 + 136) = v8;
v10 = v36;
*(_OWORD *)(a2 + 152) = v9;
v11 = v37;
*(_OWORD *)(a2 + 168) = v10;
v12 = v38;
*(_OWORD *)(a2 + 184) = v11;
*(_OWORD *)(a2 + 200) = v12;
*(_QWORD *)(a2 + 216) = v2[777];
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(a2 + 88, 0i64);
memset(a2 + 152, 0i64);
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 )
{
v21 = (__int64 *)(v2[2] + 4544i64 * v16 + 4176);
do
{
MiGetChannelInformation((_MI_PARTITION *)v2, v16, (INT64)a3, a4);
v19 = *(_QWORD *)(a2 + 64);
v18 = *(_QWORD *)(a2 + 72);
v17 = *(_QWORD *)(a2 + 80);
if( (unsigned int)(a4[0] / 0x28ui64) )
{
v22 = &v40;
v23 = (unsigned int)(a4[0] / 0x28ui64);
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 = *v21;
v21 += 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) = *(unsigned __int16 *)v2;
return 0i64;
}Referenced by:
NtManagePartition
VfUtilGetAvailableSystemPages