MiFindRebuildCandidate
UINT64 __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;
__int64 v12;
UINT64 v13;
UINT64 v14;
UINT64 v15;
UINT64 *v17;
__int128 v18;
__int64 v19;
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;
v19 = 0i64;
v20 = HighestPhysicalPage;
v18 = 0i64;
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 -1i64;
NumberOfRuns = (unsigned int)(NumberOfRuns - 1);
}
while( *(&v10->BasePage + NumberOfRuns) != __PAIR64__(Channel, v6) );
PageCount = v7->Run[(unsigned int)NumberOfRuns].PageCount;
*(_QWORD *)&v18 = v7->Run[(unsigned int)NumberOfRuns].BasePage;
for( *((_QWORD *)&v18 + 1) = PageCount + v18; ; *((_QWORD *)&v18 + 1) = v12 - v13 )
{
if( !(unsigned int)MiCollapseRunTopDown((__int64)&v18) )
goto LABEL_15;
v12 = *((_QWORD *)&v18 + 1);
v13 = SizeInPages[1];
LODWORD(HighestPhysicalPage) = 0;
v14 = *((_QWORD *)&v18 + 1) - SizeInPages[1];
v15 = MiPfnsWorthTrying(
Partition,
(_MMPFN *)((char *)MmGetPfnDb() + 48 * (*((_QWORD *)&v18 + 1) - SizeInPages[1])),
SizeInPages[1],
v8,
&HighestPhysicalPage,
v17);
if( !v15 )
break;
if( v15 > v14 - (unsigned __int64)v18 )
{
v20 = v12 - v15 - 1;
LABEL_15:
LODWORD(Channel) = v24;
v7 = PhysicalMemoryBlock;
goto LABEL_16;
}
if( v15 > v13 )
v13 = v15;
}
return v14;
}Referenced by:
MiRebuildLargePage