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