MmGetNodeChannelRanges
__int64 __fastcall MmGetNodeChannelRanges(_QWORD *a1, UINT64 *a2){
PHYSICAL_MEMORY_DESCRIPTOR *v4;
UINT64 v5;
_DWORD *Pool;
unsigned int v7;
_DWORD *v8;
_PHYSICAL_MEMORY_RUN *Run;
char *v10;
unsigned int v11;
__int64 NumberOfRuns;
_PHYSICAL_MEMORY_RUN *v13;
unsigned __int64 BasePage;
__int64 BasePage_low;
__int64 PageCount_high;
__int64 result;
v4 = MiReferencePageRuns((ULONG_PTR *)&Irp.Core.PartitionId, 1ui64);
v5 = 32i64 * (v4->NumberOfRuns - 1) + 48;
Pool = MiAllocatePool(64i64, v5, 0x68506D4Dui64);
v7 = 0;
v8 = Pool;
if( Pool )
{
Run = v4->Run;
*(_QWORD *)Pool = v4->NumberOfRuns;
v10 = (char *)(Pool + 4);
v11 = 0;
Pool[2] = (unsigned __int16)KeNumberNodes;
Pool[3] = MmNumberOfChannels;
NumberOfRuns = v4->NumberOfRuns;
v13 = &v4->Run[NumberOfRuns];
if( (_DWORD)NumberOfRuns )
{
do
{
BasePage = Run->BasePage;
++Run;
*((_QWORD *)v10 + 1) = BasePage;
*((_QWORD *)v10 + 2) = Run[-1].PageCount;
BasePage_low = LODWORD(v13->BasePage);
v13 = (_PHYSICAL_MEMORY_RUN *)((char *)v13 + 8);
*(_DWORD *)v10 = BasePage_low;
v10 += 32;
PageCount_high = HIDWORD(v13[-1].PageCount);
*((_DWORD *)v10 - 7) = PageCount_high;
++v11;
*((_QWORD *)v10 - 1) = *(_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