MmGetNodeChannelRanges
INT64 __fastcall MmGetNodeChannelRanges(_QWORD *a1, UINT64 *a2){
PHYSICAL_MEMORY_DESCRIPTOR *v4;
UINT64 v5;
__int64 v6;
unsigned int v7;
__int64 v8;
_PHYSICAL_MEMORY_RUN *Run;
__int64 v10;
unsigned int v11;
__int64 NumberOfRuns;
_PHYSICAL_MEMORY_RUN *v13;
unsigned __int64 BasePage;
__int64 BasePage_low;
__int64 PageCount_high;
INT64 result;
v4 = MiReferencePageRuns((_MI_PARTITION *)&MiSystemPartition, 1ui64);
v5 = 32i64 * (v4->NumberOfRuns - 1) + 48;
LODWORD(v6) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v7 = 0;
v8 = v6;
if( v6 )
{
Run = v4->Run;
*(_QWORD *)v6 = v4->NumberOfRuns;
v10 = v6 + 16;
v11 = 0;
*(_DWORD *)(v6 + 8) = (unsigned __int16)KeNumberNodes;
*(_DWORD *)(v6 + 12) = MmNumberOfChannels;
NumberOfRuns = v4->NumberOfRuns;
v13 = &v4->Run[NumberOfRuns];
if( (_DWORD)NumberOfRuns )
{
do
{
BasePage = Run->BasePage;
++Run;
*(_QWORD *)(v10 + 8) = BasePage;
*(_QWORD *)(v10 + 16) = Run[-1].PageCount;
BasePage_low = LODWORD(v13->BasePage);
v13 = (_PHYSICAL_MEMORY_RUN *)((char *)v13 + 8);
*(_DWORD *)v10 = BasePage_low;
v10 += 32i64;
PageCount_high = HIDWORD(v13[-1].PageCount);
*(_DWORD *)(v10 - 28) = PageCount_high;
++v11;
*(_QWORD *)(v10 - 8) = *(_BYTE *)(PageCount_high + qword_140C50AD0 + 4544 * BasePage_low + 4321) == 1;
}
while( v11 < v4->NumberOfRuns );
}
}
else
{
v7 = -1073741670;
}
MiDereferencePageRuns(v4);
result = v7;
*a1 = v8;
*a2 = v5;
return result;
}Referenced by:
ExpQueryMemoryTopologyInformation