MiComputeNodeMemory
VOID __fastcall MiComputeNodeMemory(_MI_PARTITION *Partition){
int v1;
_MI_PARTITION *v2;
unsigned __int64 v3;
_PHYSICAL_MEMORY_DESCRIPTOR *v4;
unsigned int *v5;
unsigned __int64 v6;
__int64 v7;
unsigned int *v8;
unsigned int v9;
__int64 v10;
unsigned int v11;
volatile INT64 *v12;
unsigned int *v13;
__int64 v14;
_QWORD *v15;
__int128 *v16;
__int64 v17;
__int64 v18;
unsigned __int64 v19;
PHYSICAL_MEMORY_DESCRIPTOR *v20;
unsigned int *v21;
unsigned __int64 *p_PageCount;
__int64 NumberOfRuns;
unsigned __int64 v24;
_MMPFN *PfnDb;
unsigned __int64 v26;
_QWORD *v27;
__int16 v28;
unsigned int v29;
int v30;
unsigned int v31;
_ETHREAD *CurrentThread;
unsigned __int64 v33;
unsigned __int64 v34;
__int128 v36[2];
__int64 v37;
v2 = Partition;
v3 = -1i64;
v30 = v1;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = 0i64;
v5 = (unsigned int *)*((_QWORD *)Partition + 4);
v6 = 0i64;
v28 = *(_WORD *)Partition;
if( v5 )
{
v7 = *v5;
v31 = *v5;
v8 = &v5[4 * v7 + 4];
if( (_DWORD)v7 )
{
v3 = *((_QWORD *)v5 + 2);
v6 = *(_QWORD *)&v5[4 * (unsigned int)(v7 - 1) + 6] + *(_QWORD *)&v5[4 * (unsigned int)(v7 - 1) + 4] - 1i64;
}
*((_QWORD *)Partition + 864) = v3;
*((_QWORD *)Partition + 865) = v6;
}
else
{
v8 = 0i64;
v31 = 0;
if( !v1 )
{
v20 = MiReferencePageRuns((_MI_PARTITION *)&MiSystemPartition, 1ui64);
v1 = v30;
v4 = v20;
v8 = (unsigned int *)&v20->Run[v20->NumberOfRuns];
}
}
v9 = 0;
v10 = *((_QWORD *)v2 + 2);
if( KeNumberNodes )
{
v11 = v31;
v12 = (volatile INT64 *)(v10 + 4296);
do
{
memset(v36, 0, sizeof(v36));
if( v1 )
{
if( v11 )
{
v13 = v8 + 1;
v14 = v11;
v15 = v5 + 6;
do
{
if( *(v13 - 1) == v9 )
*((_QWORD *)v36 + *v13) += *v15;
v15 += 2;
v13 += 2;
--v14;
}
while( v14 );
}
}
else if( v4->NumberOfRuns )
{
v21 = v8;
p_PageCount = &v4->Run[0].PageCount;
NumberOfRuns = v4->NumberOfRuns;
do
{
if( *v21 == v9 )
{
v24 = *(p_PageCount - 1);
PfnDb = MmGetPfnDb();
v26 = *p_PageCount;
if( *p_PageCount )
{
v29 = v21[1];
v27 = (_QWORD *)((char *)PfnDb + 48 * v24 + 40);
do
{
v34 = v3;
v33 = v3;
if( ((*v27 >> 39) & 0x3FF) == v28 )
{
++*((_QWORD *)v36 + v29);
v3 = v24;
if( v33 <= v24 )
v3 = v34;
if( v6 < v24 )
v6 = v24;
}
++v24;
v27 += 6;
--v26;
}
while( v26 );
}
}
v21 += 2;
p_PageCount += 2;
--NumberOfRuns;
}
while( NumberOfRuns );
v11 = v31;
}
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx((UINT64)v12, 0i64);
if( MmNumberOfChannels )
{
v16 = v36;
v17 = 0i64;
v18 = (unsigned int)MmNumberOfChannels;
do
{
v17 += *(_QWORD *)v16;
*(_QWORD *)((char *)v16 + (char *)v12 - (char *)&v37 - 120) = *(_QWORD *)v16;
v16 = (__int128 *)((char *)v16 + 8);
--v18;
}
while( v18 );
}
else
{
v17 = 0i64;
}
*((_QWORD *)v12 - 15) = v17;
if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v12);
KeAbPostRelease((PVOID)v12);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
v12 += 568;
v1 = v30;
++v9;
}
while( v9 < (unsigned __int16)KeNumberNodes );
v2 = Partition;
}
*((_QWORD *)v2 + 865) = v6;
v19 = 0i64;
if( v3 <= v6 )
v19 = v3;
*((_QWORD *)v2 + 864) = v19;
if( v4 )
MiDereferencePageRuns(v4);
}Referenced by:
MiAddPhysicalMemory
MiInitNucleus
MiRemovePhysicalMemory
MiUpdatePartitionMemory