MiFindRebuildCandidate
NTSTATUS __stdcall MiFindRebuildCandidate(
_MI_PARTITION *Partition,
UINT64 NodeNumber,
UINT64 Channel,
UINT64 PageSize,
UINT64 HighestPhysicalPage,
PHYSICAL_MEMORY_DESCRIPTOR *PhysicalMemoryBlock){
unsigned int v6;
PHYSICAL_MEMORY_DESCRIPTOR *v7;
unsigned int v8;
__int64 NumberOfRuns;
_PHYSICAL_MEMORY_RUN *v10;
unsigned __int64 PageCount;
int v12;
__int64 v13;
UINT64 v14;
UINT64 v15;
UINT64 v16;
UINT64 *v18;
_MI_PAGE_RANGE PageRange;
UINT64 v20;
UINT64 SizeInPages[2];
__int64 v22;
int v24;
v24 = Channel;
v22 = 0i64;
v6 = NodeNumber;
v7 = PhysicalMemoryBlock;
v8 = 0x800000;
SizeInPages[1] = 0i64;
SizeInPages[0] = PageSize;
NumberOfRuns = PhysicalMemoryBlock->NumberOfRuns;
v20 = HighestPhysicalPage;
memset(&PageRange, 0, sizeof(PageRange));
SizeInPages[1] = PageSize;
v10 = &PhysicalMemoryBlock->Run[NumberOfRuns];
if( PageSize == 512 )
{
v8 = 41943040;
}
else if( PageSize == 16 )
{
v8 = 25165824;
}
do
{
LABEL_16:
if( !(_DWORD)NumberOfRuns )
return -1;
NumberOfRuns = (unsigned int)(NumberOfRuns - 1);
}
while( *(&v10->BasePage + NumberOfRuns) != __PAIR64__(Channel, v6) );
PageCount = v7->Run[(unsigned int)NumberOfRuns].PageCount;
*(_QWORD *)&PageRange.BasePage = v7->Run[(unsigned int)NumberOfRuns].BasePage;
for( *(_QWORD *)&PageRange.LowestPageOkToUse = PageCount + *(_QWORD *)&PageRange.BasePage;
;
*(_QWORD *)&PageRange.LowestPageOkToUse = v13 - v14 )
{
MiCollapseRunTopDown(&PageRange);
if( !v12 )
goto LABEL_15;
v13 = *(_QWORD *)&PageRange.LowestPageOkToUse;
v14 = SizeInPages[1];
LODWORD(HighestPhysicalPage) = 0;
v15 = *(_QWORD *)&PageRange.LowestPageOkToUse - SizeInPages[1];
MiPfnsWorthTrying(
Partition,
&MmGetPfnDb()[*(_QWORD *)&PageRange.LowestPageOkToUse - SizeInPages[1]],
SizeInPages[1],
v8,
&HighestPhysicalPage,
v18);
if( !v16 )
break;
if( v16 > v15 - *(_QWORD *)&PageRange.BasePage )
{
v20 = v13 - v16 - 1;
LABEL_15:
LODWORD(Channel) = v24;
v7 = PhysicalMemoryBlock;
goto LABEL_16;
}
if( v16 > v14 )
v14 = v16;
}
return v15;
}Referenced by:
MiRebuildLargePage