PspDereferenceQuotaBlock
VOID __fastcall PspDereferenceQuotaBlock(volatile INT32 *P){
int v2;
char *v3;
volatile INT32 *v4;
__int64 v5;
INT64 v6;
__int64 v7;
if( _InterlockedExchangeAdd(P + 128, 0xFFFFFFFF) == 1 )
{
v2 = 0;
v3 = PspResourceFlags;
v4 = P + 18;
do
{
if( (*v3 & 3) == 1 )
{
v5 = *((_QWORD *)v4 + 1);
v6 = *((_QWORD *)v4 - 1);
if( v6 + *(_QWORD *)v4 )
{
if( v5 )
{
v7 = _InterlockedExchange64((volatile __int64 *)v4, 0i64);
v6 = _InterlockedExchange64((volatile __int64 *)v4 - 1, 0i64) + v7;
}
}
else
{
v6 = 0i64;
}
if( v6 || v5 )
PspReturnResourceQuota((unsigned int)v2, (INT64)(v4 - 18), v6, v5 != 0);
}
++v2;
v4 += 32;
v3 += 8;
}
while( v2 < 4 );
PspRemoveQuotaBlock((__int64)P);
ExFreePoolWithTag((PVOID)P, 0);
}
}Referenced by:
ObpFreeObject
PsReturnSharedPoolQuota
PspAssignProcessQuotaBlock