MmInitializeMemoryLimits
_PHYSICAL_MEMORY_DESCRIPTOR *__stdcall MmInitializeMemoryLimits(
_LOADER_PARAMETER_BLOCK *LoaderBlock,
UINT8 *IncludeType){
_LIST_ENTRY *p_MemoryDescriptorListHead;
unsigned int v3;
_LIST_ENTRY *Flink;
__int64 v6;
_PHYSICAL_MEMORY_DESCRIPTOR *Pool;
_PHYSICAL_MEMORY_DESCRIPTOR *v8;
unsigned int v9;
_LIST_ENTRY *v10;
unsigned __int64 v11;
__int64 v12;
__int64 Flink_low;
_PHYSICAL_MEMORY_DESCRIPTOR *v14;
_PHYSICAL_MEMORY_DESCRIPTOR *v15;
_PHYSICAL_MEMORY_DESCRIPTOR *result;
_LIST_ENTRY *v17;
unsigned __int64 Blink;
__int64 v19;
unsigned __int64 v20;
p_MemoryDescriptorListHead = &LoaderBlock->MemoryDescriptorListHead;
v3 = 0;
Flink = LoaderBlock->MemoryDescriptorListHead.Flink;
if( Flink == &LoaderBlock->MemoryDescriptorListHead )
return 0i64;
do
{
Flink = Flink->Flink;
v6 = v3++;
}
while( Flink != p_MemoryDescriptorListHead );
if( !v3 )
return 0i64;
Pool = (_PHYSICAL_MEMORY_DESCRIPTOR *)MiAllocatePool(64i64, 16 * (v6 + 2), 0x6C4D6D4Dui64);
v8 = Pool;
if( !Pool )
return 0i64;
Pool->NumberOfRuns = v3;
v9 = 0;
v10 = p_MemoryDescriptorListHead->Flink;
v11 = 0i64;
v12 = -1i64;
if( p_MemoryDescriptorListHead->Flink == p_MemoryDescriptorListHead )
goto LABEL_19;
do
{
Flink_low = SLODWORD(v10[1].Flink);
if( (int)Flink_low < 41 && IncludeType[Flink_low] )
{
v17 = v10[2].Flink;
Blink = (unsigned __int64)v10[1].Blink;
v11 += (unsigned __int64)v17;
if( Blink == v12 && v9 )
{
v8->Run[v9 - 1].PageCount += (unsigned __int64)v17;
v12 += (__int64)v10[2].Flink;
}
else
{
v19 = v9++;
v8->Run[v19].BasePage = Blink;
v20 = (unsigned __int64)v10[2].Flink;
v8->Run[v19].PageCount = v20;
v12 = v20 + Blink;
}
}
v10 = v10->Flink;
}
while( v10 != p_MemoryDescriptorListHead );
if( !v9 )
{
LABEL_19:
v8->Run[0].BasePage = 0i64;
v8->Run[0].PageCount = 0i64;
}
else if( v3 > v9 )
{
v14 = (_PHYSICAL_MEMORY_DESCRIPTOR *)MiAllocatePool(64i64, 16 * (v9 - 1 + 2i64), 0x6C4D6D4Dui64);
v15 = v14;
if( v14 )
{
memmove(v14->Run, v8->Run, 16 * v9);
ExFreePoolWithTag(v8, 0);
v8 = v15;
}
}
v8->NumberOfRuns = v9;
result = v8;
v8->NumberOfPages = v11;
return result;
}Referenced by:
IopInitCrashDumpDuringSysInit
IopInitializeResourceMap
MiInitNucleus