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 FreeZeroLargePages;
KQUEUE *v16;
int PfnPageSizeIndex;
UINT64 v19;
_LIST_ENTRY *Blink;
UINT64 v21;
int v22;
UINT64 BitsMustBeChanged;
INT64 BitsMustBeChangeda;
INT64 v25;
INT64 v26;
INT64 v27;
UINT64 v28;
UINT64 v29;
int PfnStatea;
CHAR v31;
unsigned int v32;
v7 = MiLargePageSizes[*(unsigned int *)LargePageIndex];
v29 = v7;
if( (unsigned int)PreferredNode >= (unsigned __int16)KeNumberNodes )
{
PreferredNode = *((unsigned int *)*(&KiProcessorBlock + *((unsigned int *)KeGetCurrentThread() + 147)) + 8133);
v8 = (unsigned int *)(qword_140C4DBD8 + 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;
FreeZeroLargePages = MiGetFreeZeroLargePages(
(INT64)Partition,
*(unsigned int *)LargePageIndex,
1i64,
v12,
BitsMustBeChanged,
v25,
v26,
v27);
}
else
{
LODWORD(v26) = v32;
LODWORD(v25) = v12;
LODWORD(BitsMustBeChanged) = 0;
FreeZeroLargePages = MiGetLargePagesDemoteAsNeeded(
(INT64)Partition,
PreferredNode,
v7,
v13,
BitsMustBeChanged,
v25,
v26);
}
v16 = (KQUEUE *)FreeZeroLargePages;
if( FreeZeroLargePages )
break;
if( ++v8 == (unsigned int *)v9 )
return 0i64;
PreferredNode = *v8;
v14 = PfnStatea;
v7 = v29;
v13 = v28;
}
PfnPageSizeIndex = MiGetPfnPageSizeIndex(FreeZeroLargePages);
*(_DWORD *)LargePageIndex = PfnPageSizeIndex;
v19 = MiLargePageSizes[PfnPageSizeIndex];
LODWORD(BitsMustBeChanged) = 1;
MiUpdateLargePageBitMap((UINT64)Partition, ((char *)v16 - (char *)MmGetPfnDb()) / 48, v19, 1ui64, BitsMustBeChanged);
MiConvertEntireLargePageToSmall(v16, *(_DWORD *)LargePageIndex, 0, (LARGE_INTEGER *)1, 0i64, 0i64);
if( (v10 & 0x40000000) == 0 )
{
Blink = v16->Header.WaitListHead.Blink;
v21 = v19;
v22 = ((v10 & 0x100000) != 0) + 1;
do
{
LODWORD(BitsMustBeChangeda) = v22;
MiSetPfnOwnedAndActive((INT64)v16, v31, -8i64, v32, BitsMustBeChangeda);
v16->Header.WaitListHead.Blink = Blink;
v16 = (KQUEUE *)((char *)v16 + 48);
--v21;
}
while( v21 );
return(_MMPFN *)((char *)v16 - 48 * v19);
}
return(_MMPFN *)v16;
}Referenced by:
MiAllocatePartitionPhysicalPages
MiFindContiguousPages