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