MmReleaseResourceCharge
VOID __stdcall MmReleaseResourceCharge(UINT64 NumberOfPages, UINT64 ResourceFlags, _MM_CHARGE_COMPONENT Component){
struct _KPRCB *CurrentPrcb;
unsigned __int64 v4;
__int64 CachedResidentAvailable;
bool v6;
signed __int32 v7;
signed __int32 v8;
if( (ResourceFlags & 2) == 0 )
goto LABEL_2;
if( Component )
{
if( Component != MmChargeRegistry )
goto LABEL_2;
CurrentPrcb = KeGetCurrentPrcb();
v4 = NumberOfPages;
CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable != -1 )
{
if( CachedResidentAvailable + NumberOfPages <= 0x100 )
{
do
{
if( NumberOfPages >= 0x80000 )
break;
v8 = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
CachedResidentAvailable + NumberOfPages,
CachedResidentAvailable);
v6 = (_DWORD)CachedResidentAvailable == v8;
LODWORD(CachedResidentAvailable) = v8;
if( v6 )
goto LABEL_2;
}
while( v8 != -1 && NumberOfPages + v8 <= 0x100 );
}
goto LABEL_11;
}
}
else
{
CurrentPrcb = KeGetCurrentPrcb();
v4 = NumberOfPages;
CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable != -1 )
{
if( CachedResidentAvailable + NumberOfPages <= 0x100 )
{
do
{
if( NumberOfPages >= 0x80000 )
break;
v7 = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
CachedResidentAvailable + NumberOfPages,
CachedResidentAvailable);
v6 = (_DWORD)CachedResidentAvailable == v7;
LODWORD(CachedResidentAvailable) = v7;
if( v6 )
goto LABEL_2;
}
while( v7 != -1 && NumberOfPages + v7 <= 0x100 );
}
LABEL_11:
if( (int)CachedResidentAvailable > 192
&& (_DWORD)CachedResidentAvailable != -1
&& (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
192,
CachedResidentAvailable) )
{
v4 = NumberOfPages + (int)CachedResidentAvailable - 192;
}
}
}
if( v4 )
_InterlockedExchangeAdd64((_QWORD *)&stru_140C50B28 + 883, v4);
LABEL_2:
if( (ResourceFlags & 1) != 0 )
MiReturnCommit(&Irp, NumberOfPages);
}Referenced by:
MmChargeResources
SmAcquireReleaseCharges