MiCreateNodeLists
PHYSICAL_MEMORY_DESCRIPTOR *__stdcall MiCreateNodeLists(
_MI_PARTITION *Partition,
PHYSICAL_MEMORY_DESCRIPTOR *PhysicalMemoryBlock){
unsigned int v2;
int v5;
PHYSICAL_MEMORY_DESCRIPTOR *v6;
char *Pool;
__int64 v8;
__int64 v9;
__int64 v10;
__int64 v11;
__int64 v12;
void *v14;
__int64 v15;
_QWORD ListHead[2];
__int64 v17;
v2 = 0;
ListHead[1] = ListHead;
v17 = 0i64;
ListHead[0] = ListHead;
v5 = 0;
v6 = 0i64;
while( MiDescribePageRun(
(_MI_MEMORY_NODE_LISTHEAD *)ListHead,
PhysicalMemoryBlock->Run[v5].BasePage,
PhysicalMemoryBlock->Run[v5].PageCount) )
{
if( ++v5 == PhysicalMemoryBlock->NumberOfRuns )
{
Pool = (char *)MiAllocatePool(64i64, 24 * v17 + 32, 0x6C4D6D4Dui64);
if( Pool )
{
v6 = (PHYSICAL_MEMORY_DESCRIPTOR *)(Pool + 16);
*((_QWORD *)Pool + 1) = 1i64;
*(_QWORD *)Pool = Partition;
*((_DWORD *)Pool + 4) = v17;
v8 = (__int64)&Pool[16 * *((unsigned int *)Pool + 4) + 32];
*((_QWORD *)Pool + 3) = PhysicalMemoryBlock->NumberOfPages;
while( 1 )
{
v9 = ListHead[0];
if( (_QWORD *)ListHead[0] == ListHead )
return v6;
if( *(_QWORD **)(ListHead[0] + 8i64) != ListHead )
goto LABEL_11;
v10 = *(_QWORD *)ListHead[0];
if( *(_QWORD *)(*(_QWORD *)ListHead[0] + 8i64) != ListHead[0] )
goto LABEL_11;
ListHead[0] = *(_QWORD *)ListHead[0];
*(_QWORD *)(v10 + 8) = ListHead;
v11 = v2;
v12 = v2++;
v12 *= 2i64;
*(&v6->Run[0].BasePage + v12) = *(_QWORD *)(v9 + 16);
*(&v6->Run[0].PageCount + v12) = *(_QWORD *)(v9 + 24);
*(_DWORD *)(v8 + 8 * v11) = *(_DWORD *)(v9 + 32);
*(_DWORD *)(v8 + 8 * v11 + 4) = *(_DWORD *)(v9 + 36);
ExFreePoolWithTag((PVOID)v9, 0);
}
}
break;
}
}
while( 1 )
{
v14 = (void *)ListHead[0];
if( (_QWORD *)ListHead[0] == ListHead )
break;
if( *(_QWORD **)(ListHead[0] + 8i64) != ListHead
|| (v15 = *(_QWORD *)ListHead[0], *(_QWORD *)(*(_QWORD *)ListHead[0] + 8i64) != ListHead[0]) )
{
LABEL_11:
__fastfail(3u);
}
ListHead[0] = *(_QWORD *)ListHead[0];
*(_QWORD *)(v15 + 8) = ListHead;
ExFreePoolWithTag(v14, 0);
}
return v6;
}Referenced by:
MiInitNucleus
MiMakePartitionMemoryBlock