MmRelocatePfnList
VOID __stdcall MmRelocatePfnList(){
unsigned __int64 v0;
unsigned __int64 v1;
unsigned int v2;
unsigned int v3;
unsigned __int64 v4;
unsigned __int64 v5;
int v6;
_ETHREAD *CurrentThread;
unsigned __int64 v8;
SIZE_T v9;
unsigned __int64 FileObject;
_MMPFN *v11;
PVOID v12;
UINT64 *v13;
SIZE_T v14;
_MMPFN_IDENTITY Identity;
INT64 v16[2];
__int64 v17;
UINT64 DrainStacks;
LODWORD(DrainStacks) = 0;
v14 = 0i64;
v17 = 0i64;
v4 = v0;
v5 = v1;
memset(&Identity, 0, sizeof(Identity));
*(_OWORD *)v16 = 0i64;
if( v2 < (unsigned __int16)KeNumberNodes && v3 < MmNumberOfChannels )
{
v6 = (v2 << byte_140C4DBCC) | (v3 << byte_140C4DBCD);
MiCreatePteCopyList(v1, 0x100ui64, (__int64)v16);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v8 = v4 + 24 * v5;
MiLockDynamicMemoryShared((INT64)&MiSystemPartition, (INT64)CurrentThread);
while( 1 )
{
if( v4 >= v8 )
{
MiUnlockDynamicMemoryShared((INT64)&MiSystemPartition, (INT64)CurrentThread);
MiReleasePteCopyList((INT64)v16);
return;
}
v9 = *(_QWORD *)(v4 + 8);
FileObject = 0i64;
Identity.u1.e1 = 0i64;
Identity.u2.FileObject = 0i64;
Identity.PageFrameIndex = v9;
if( (unsigned int)MiIsPfn(v9) )
{
v11 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * v9);
MiIdentifyPfnWrapper(v11, &Identity);
FileObject = (unsigned __int64)Identity.u2.FileObject;
if( Identity.u2.FileObject == *(PVOID *)(v4 + 16)
&& ((*(_QWORD *)&Identity.u1.e1 ^ *(_QWORD *)v4) & 0x1FFFFFFFFFFFE00i64) == 0 )
{
if( !MiPfnsWorthTrying((_MI_PARTITION *)&MiSystemPartition, v11, 1ui64, 0i64, &DrainStacks, v13) )
{
if( (_DWORD)DrainStacks == 1 )
MiEmptyKernelStackCache();
if( !MiClaimPhysicalRun(
(__int64)&MiSystemPartition,
v9,
1i64,
0xFFFFFFFFFi64,
(__int64)v16,
0x400000,
v6,
0i64,
*((unsigned __int8 *)v11 + 34) >> 6,
&v14)
&& v14 != -1i64 )
{
Identity.PageFrameIndex = v14;
goto LABEL_15;
}
}
FileObject = (unsigned __int64)Identity.u2.FileObject;
}
}
Identity.u2.FileObject = (PVOID)(FileObject | 2);
LABEL_15:
v12 = Identity.u2.FileObject;
*(_OWORD *)v4 = *(_OWORD *)&Identity.u1.e1;
*(_QWORD *)(v4 + 16) = v12;
v4 += 24i64;
}
}
}Referenced by:
PfpPfnPrioRequest