MiUnlinkStandbyBatch
NTSTATUS __stdcall MiUnlinkStandbyBatch(
_MMPFN *BaseStandbyPfn,
_MMPTE *ProtoPte,
UINT64 OldPriority,
_MMPTE *PoINTerPte,
UINT64 NumberOfPtes,
_MMPFN **PfnToDiscard){
UINT64 v6;
int v8;
_MMPFN *PfnDb;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v11;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v12;
INT64 v13;
char v14;
char v15;
int v16;
int v17;
int v18;
v6 = NumberOfPtes;
v8 = OldPriority;
if( !NumberOfPtes )
return NumberOfPtes - v6;
do
{
PfnDb = MmGetPfnDb();
while( 1 )
{
while( 1 )
{
v11.Long = (unsigned __int64)ProtoPte->u;
v12.Long = (unsigned __int64)ProtoPte->u;
if( (ProtoPte->u.Long & 1) != 0 )
goto LABEL_11;
if( (ProtoPte->u.Long & 0xC00) != 2048 )
return NumberOfPtes - v6;
if( !v11.Long || !*(&stru_140C4DB30 + 42) || (*(&stru_140C4DB30 + 42) & v11.Long) != 0 )
{
v12.Long = (unsigned __int64)ProtoPte->u;
if( *(&stru_140C4DB30 + 42) && (v11.Long & 0x10) == 0 )
v12.Long = v11.Long & ~*(&stru_140C4DB30 + 42);
LABEL_11:
if( (PfnDb[(v12.Long >> 12) & 0xFFFFFFFFFi64].u4._bf_0 & 0x4000000000000i64) != 0 )
break;
}
}
v13 = (INT64)&PfnDb[(v12.Long >> 12) & 0xFFFFFFFFFi64];
if( _interlockedbittestandset64((volatile signed __int32 *)(v13 + 24), 0x3Fui64) )
return NumberOfPtes - v6;
if( ProtoPte->u.Long == v11.Long )
break;
_InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
if( !v13 )
break;
if( (ProtoPte->u.Long & 1) == 0 )
{
v14 = *(_BYTE *)(v13 + 34);
if( (v14 & 0x20) == 0 )
{
v15 = *(_BYTE *)(v13 + 35);
if( (v15 & 0x40) == 0 && (v14 & 7) == 2 )
{
v16 = (v15 & 8) != 0 ? 5 : v15 & 7;
if( v16 == v8 )
{
LOBYTE(v17) = MiIsPfnFromSlabAllocation(v13);
if( !v17 || *(_WORD *)(v13 + 32) || *(__int64 *)v13 >= 0 )
continue;
}
}
}
}
_InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
return NumberOfPtes - v6;
MiUnlinkPageFromList((_MMPFN *)v13, 1ui64);
if( !v18 )
{
*PfnToDiscard = (_MMPFN *)v13;
return NumberOfPtes - v6;
}
++PoINTerPte;
++ProtoPte;
MiReadyStandbyPageForActive((_MMPFN *)v13, PoINTerPte);
_InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
--v6;
}
while( v6 );
return NumberOfPtes - v6;
}Referenced by:
MmCheckCachedPageStates