PspExpandQuota
UINT8 __stdcall PspExpandQuota(
_PS_RESOURCE_TYPE ResourceType,
_PSP_QUOTA_ENTRY *QuotaEntry,
UINT64 Usage,
UINT64 Amount,
UINT64 *pLimit){
int *v7;
UINT64 v10;
UINT64 v11;
UINT64 v12;
UINT8 OldIrql;
__int64 v15;
v15 = 0i64;
OldIrql = 0;
v7 = &PspQuotaExpansionDescriptors[14 * ResourceType];
PspLockQuotaExpansion(v7, &OldIrql);
v10 = *(_QWORD *)&QuotaEntry->Limit;
if( Usage + Amount <= v10 )
{
PspUnlockQuotaExpansion(v7, OldIrql);
*pLimit = v10;
return 1;
}
if( (*((unsigned __int8(__fastcall **)(_QWORD, _QWORD, _QWORD, __int64 *))v7 + 3))(
(unsigned int)ResourceType,
*(_QWORD *)&QuotaEntry->Limit,
0i64,
&v15)
|| PspReleaseReturnedQuota(ResourceType, v7)
&& (*((unsigned __int8(__fastcall **)(_QWORD, UINT64, _QWORD, __int64 *))v7 + 3))(
(unsigned int)ResourceType,
v10,
0i64,
&v15) )
{
v11 = v15 - v10;
v12 = v11 + _InterlockedExchangeAdd64((volatile signed __int64 *)&QuotaEntry->Limit, v15 - v10);
PspUnlockQuotaExpansion(v7, OldIrql);
*pLimit = v12;
return 1;
}
PspUnlockQuotaExpansion(v7, OldIrql);
*pLimit = v10;
return 0;
}Referenced by:
ExAllocatePoolWithQuotaTag
IopVerifierExAllocatePoolWithQuota_1
PspChargeQuota