MiFindLargeNodePage

_MMPFN *__stdcall MiFindLargeNodePage(
        _MI_PARTITION *Partition,
        UINT64 PreferredNode,
        UINT64 *LargePageIndex,
        UINT64 Flags,
        UINT64 PfnState){
  UINT64 v7; 
  unsigned int *v8; 
  __int64 v9; 
  int v10; 
  int v11; 
  unsigned int v12; 
  UINT64 v13; 
  int v14; 
  INT64 v15; 
  INT64 v16; 
  NTSTATUS PfnPageSizeIndex; 
  UINT64 v19; 
  __int64 v20; 
  UINT64 v21; 
  int v22; 
  UINT64 BitsMustBeChanged; 
  UINT64 BitsMustBeChangeda; 
  INT64 v25; 
  INT64 v26; 
  INT64 v27; 
  UINT64 v28; 
  UINT64 v29; 
  int PfnStatea; 
  unsigned int v31; 
  _MI_PFN_CACHE_ATTRIBUTE v32; 

  v7 = MiLargePageSizes[*(unsigned int *)LargePageIndex];
  v29 = v7;
  if( (unsigned int)PreferredNode >= (unsigned __int16)KeNumberNodes )
  {
    PreferredNode = (*(&KiProcessorBlock + KeGetCurrentThread()->IdealProcessor))->NodeColor;
    v8 = (unsigned int *)(*(&stru_140C4DB30 + 21) + 4i64 * (unsigned int)PreferredNode * (unsigned __int16)KeNumberNodes);
    v9 = (__int64)&v8[(unsigned __int16)KeNumberNodes];
  }
  else
  {
    v8 = 0i64;
    v9 = 4i64;
  }
  v10 = PfnState;
  v11 = (4 * ((PfnState & 1) == 0)) | 1;
  if( (PfnState & 0x8000) == 0 )
    v11 = 4 * ((PfnState & 1) == 0);
  v12 = v11 | 0x10;
  if( (PfnState & 8) != 0 )
    v12 = v11;
  v13 = MiLargePageSizes[(unsigned int)Flags];
  v14 = PfnState & 0x4000;
  v28 = v13;
  PfnStatea = v14;
  while( 1 )
  {
    if( v14 )
    {
      LODWORD(v27) = v32;
      LODWORD(v26) = 4;
      LODWORD(v25) = 0;
      LODWORD(BitsMustBeChanged) = PreferredNode;
      LODWORD(v15) = MiGetFreeZeroLargePages(
                       (INT64)Partition,
                       *(unsigned int *)LargePageIndex,
                       1i64,
                       v12,
                       BitsMustBeChanged,
                       v25,
                       v26,
                       v27);
    }
    else
    {
      LODWORD(v26) = v32;
      LODWORD(v25) = v12;
      LODWORD(BitsMustBeChanged) = 0;
      LODWORD(v15) = MiGetLargePagesDemoteAsNeeded(
                       (INT64)Partition,
                       PreferredNode,
                       v7,
                       v13,
                       BitsMustBeChanged,
                       v25,
                       v26);
    }
    v16 = v15;
    if( v15 )
      break;
    if( ++v8 == (unsigned int *)v9 )
      return 0i64;
    PreferredNode = *v8;
    v14 = PfnStatea;
    v7 = v29;
    v13 = v28;
  }
  PfnPageSizeIndex = MiGetPfnPageSizeIndex(v15);
  *(_DWORD *)LargePageIndex = PfnPageSizeIndex;
  v19 = MiLargePageSizes[PfnPageSizeIndex];
  LODWORD(BitsMustBeChanged) = 1;
  MiUpdateLargePageBitMap((UINT64)Partition, (v16 - (__int64)MmGetPfnDb()) / 48, v19, 1ui64, BitsMustBeChanged);
  MiConvertEntireLargePageToSmall((_KQUEUE *)v16, *(_DWORD *)LargePageIndex, 0, (_LARGE_INTEGER *)1, 0i64, 0i64);
  if( (v10 & 0x40000000) == 0 )
  {
    v20 = *(_QWORD *)(v16 + 16);
    v21 = v19;
    v22 = ((v10 & 0x100000) != 0) + 1;
    do
    {
      LODWORD(BitsMustBeChangeda) = v22;
      MiSetPfnOwnedAndActive((_MMPFN *)v16, v31, (_MMPTE *)0xFFFFFFFFFFFFFFF8i64, v32, BitsMustBeChangeda);
      *(_QWORD *)(v16 + 16) = v20;
      v16 += 48i64;
      --v21;
    }
    while( v21 );
    v16 += -48i64 * v19;
  }
  return(_MMPFN *)v16;
}

Referenced by:

MiAllocatePartitionPhysicalPages
MiFindContiguousPages