MiChargeForLockedPage
_MI_RESAVAIL_CHARGE __stdcall MiChargeForLockedPage(_MMPFN *Pfn1, UINT64 ChargeFlags){
UINT8 v2;
wchar_t *v3;
int v4;
UINT64 v5;
int v6;
__int64 v7;
unsigned int v8;
char v9;
char v10;
int v11;
__int64 v12;
_MI_PARTITION *v13;
_MI_RESAVAIL_CHARGE result;
struct _KPRCB *CurrentPrcb;
signed __int32 CachedResidentAvailable;
signed __int32 v17;
_MI_RESAVAIL_CHARGE v18;
v4 = ChargeFlags & 1;
v5 = (unsigned int)-(v4 != 0);
LOBYTE(v6) = MI_PFN_IS_PROTO((_UNICODE_STRING *)Pfn1, (_UNICODE_STRING *)(v4 ^ 1u), v2, v3);
if( v6 && (*(_DWORD *)(v7 + 16) & 0x400i64) != 0 )
{
v9 = 1;
}
else
{
MiIsPfnCommitNotCharged((_MMPFN *)v7);
v9 = v10;
if( v11 )
v9 = 1;
}
v12 = (*(_QWORD *)(v7 + 40) >> 39) & 0x3FFi64;
v13 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v12);
if( !v9
|| (result = MiChargeCommit(*(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v12), 1ui64, v8)) != MiChargeFailed )
{
if( v13 == &Irp )
{
CurrentPrcb = KeGetCurrentPrcb();
CachedResidentAvailable = CurrentPrcb->CachedResidentAvailable;
if( CachedResidentAvailable )
{
while( CachedResidentAvailable != -1 )
{
v17 = CachedResidentAvailable;
CachedResidentAvailable = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
CachedResidentAvailable - 1,
CachedResidentAvailable);
if( v17 == CachedResidentAvailable )
return 1;
if( !CachedResidentAvailable )
break;
}
}
}
v18 = MiChargePartitionResidentAvailable(v13, 1ui64, v5);
if( v18 == MiChargeFailed )
{
if( v9 )
MiReturnCommit(v13, 1ui64);
}
return v18;
}
return result;
}Referenced by:
MiAddLockedPageCharge
MiCheckProtoPtePageState
MiLockProtoPoolPage
MiMigratePfn
MiWalkEntireImage