MiAddPhysicalMemoryChunks
INT64 __stdcall MiAddPhysicalMemoryChunks(_MI_PARTITION *Partition, LARGE_INTEGER *StartAddress, LARGE_INTEGER *a3){
unsigned int v3;
unsigned __int64 QuadPart;
LONGLONG v5;
unsigned __int64 v6;
int v7;
int v8;
unsigned __int64 v9;
unsigned int v10;
int v11;
UINT64 v12;
unsigned __int64 v13;
UINT64 v14;
unsigned __int64 v15;
int v16;
__int64 v17;
unsigned __int64 v18;
_BOOL8 v19;
__int64 v21;
unsigned __int64 v22;
_LARGE_INTEGER v23;
unsigned int LargestPageIndex;
unsigned __int64 v25;
unsigned int v26;
unsigned __int64 v27;
unsigned __int64 v28;
__int64 v29;
unsigned int v30;
int v31;
_LARGE_INTEGER NumberOfBytes;
unsigned __int64 v33;
_LARGE_INTEGER StartAddressa;
LARGE_INTEGER *v36;
v36 = a3;
QuadPart = StartAddress->QuadPart;
v5 = 0i64;
StartAddressa = *StartAddress;
v6 = a3->QuadPart;
v7 = 0;
v8 = 0;
v33 = 0i64;
v9 = v6;
v10 = v3;
v11 = 0;
while( 1 )
{
while( 1 )
{
v12 = QuadPart >> 12;
MiRestrictRangeToNode(v12, v6 >> 12);
v15 = v13;
if( v12 < 0x100000 && v12 + v13 > 0x100000 )
v15 = 0x100000 - v12;
MiPageToNode(v12, v14);
NumberOfBytes.QuadPart = qword_140C50AD0
+ 4544i64 * ((unsigned int)MiGetClosestImplicitNode((unsigned int)(v16 + 1)) - 1);
if( v11 < 0 )
{
v15 = v33;
if( v33 > 0x200 )
v15 = 512i64;
switch( v8 )
{
case 0:
if( v33 > 0x200 )
{
v7 = 0;
break;
}
LODWORD(v19) = v12 < 0x100000;
goto LABEL_21;
case 1:
v19 = v33 <= 0x200;
LABEL_21:
v7 = v19 + 1;
break;
case 2:
v7 = 3;
break;
case 3:
v7 = 4;
break;
case 4:
goto LABEL_27;
}
}
else
{
v7 = 0;
LODWORD(v17) = 1;
if( (v12 & 0x1FF) != 0 )
{
LABEL_11:
if( v15 > MiLargePageSizes[(unsigned int)v17] - v12 % MiLargePageSizes[(unsigned int)v17] )
v15 = MiLargePageSizes[(unsigned int)v17] - v12 % MiLargePageSizes[(unsigned int)v17];
}
else
{
v18 = 512i64;
while( v15 >= v18 )
{
v15 &= ~(v18 - 1);
if( !(_DWORD)v17 )
break;
v17 = (unsigned int)(v17 - 1);
v18 = MiLargePageSizes[v17];
if( v12 % v18 )
goto LABEL_11;
}
}
}
v21 = 1i64;
LargestPageIndex = MiGetLargestPageIndex();
if( LargestPageIndex <= 1 )
{
while( 1 )
{
v25 = MiLargePageSizes[LargestPageIndex];
if( !(v12 % v25) && !(v15 % v25) )
break;
if( ++LargestPageIndex > 1 )
goto LABEL_34;
}
v21 = MiLargePageSizes[LargestPageIndex];
}
LABEL_34:
v26 = v10 & 0xFFFFA7FF;
if( v15 >= v22 )
{
if( v7 )
{
LABEL_41:
if( v7 != 1 || (v27 = MiNodeLargeFreeZeroPages2(v23.QuadPart, 1i64)) == 0 )
{
if( v15 != 512 )
v15 = 512i64;
goto LABEL_58;
}
}
else
{
v27 = MiNodeLargeFreeZeroPages2(v23.QuadPart, 0i64);
if( !v27 )
{
if( v15 + v12 > 0x100000 && v15 > 0x200 )
{
LargestPageIndex = 1;
v15 = 512i64;
v21 = 512i64;
}
v23 = NumberOfBytes;
v7 = 1;
goto LABEL_41;
}
}
if( v27 < (unsigned __int64)(48 * v21) >> 12 )
{
while( !LargestPageIndex )
{
LargestPageIndex = 1;
v21 = MiLargePageSizes[1];
if( v27 >= (unsigned __int64)(48 * v21) >> 12 )
goto LABEL_48;
}
v21 = 1i64;
}
LABEL_48:
if( v21 != 1 )
{
v26 |= 0x4000u;
if( Partition == (_MI_PARTITION *)&MiSystemPartition )
{
if( LargestPageIndex == 1 )
v26 |= 0x800u;
else
v26 |= 0x1000u;
}
}
v28 = v27 << 12;
v29 = ~(v21 - 1);
if( v15 > (v29 & (v28 / 0x30)) )
v15 = v29 & (v28 / 0x30);
}
LABEL_58:
v33 = v15;
v30 = v26 & 0xFFFFDFFF;
v10 = v26 | 0x2000;
v8 = v7;
if( v7 > 2 )
v10 = v30;
NumberOfBytes.QuadPart = v15 << 12;
MiAddPhysicalMemory(Partition, &StartAddressa, &NumberOfBytes, v10);
v11 = v31;
if( v31 < 0 )
break;
QuadPart = NumberOfBytes.QuadPart + StartAddressa.QuadPart;
v5 += NumberOfBytes.QuadPart;
StartAddressa.QuadPart += NumberOfBytes.QuadPart;
v6 = v9 - v5;
if( v9 == v5 )
goto LABEL_27;
}
if( v31 != -1073741670 && v31 != -1073741523 || v7 == 4 )
break;
QuadPart = StartAddressa.QuadPart;
v6 = NumberOfBytes.QuadPart;
}
LABEL_27:
v36->QuadPart = v5;
return(unsigned int)v11;
}Referenced by:
MiActOnPartitionNodePages
MiHotAddBootDeferredDescriptors
MmAddPhysicalMemory