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