PspChargeQuota
NTSTATUS __stdcall PspChargeQuota(
_EPROCESS_QUOTA_BLOCK *QuotaBlock,
_EPROCESS *Process,
PS_RESOURCE_TYPE ResourceType,
UINT64 Amount){
__int64 v4;
UINT64 *CacheAlign;
char v8;
UINT64 v9;
UINT64 v10;
unsigned __int64 v11;
bool v12;
signed __int64 v13;
unsigned __int64 v14;
unsigned __int64 v16;
char *v17;
unsigned __int64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
unsigned __int64 v21;
int v22[8];
UINT64 pLimit;
v4 = ResourceType;
CacheAlign = (UINT64 *)QuotaBlock->QuotaEntry[(__int64)(int)ResourceType].CacheAlign;
v8 = PspResourceFlags[8 * ResourceType];
_m_prefetchw(CacheAlign);
v9 = *CacheAlign;
_InterlockedOr(v22, 0);
while( 2 )
{
v10 = CacheAlign[8];
LABEL_3:
for( pLimit = v10; ; v10 = pLimit )
{
v11 = v9 + Amount;
if( v9 + Amount < v9 )
return *(_DWORD *)&PspResourceFlags[8 * v4 + 4];
if( v11 <= v10 )
break;
if( (v8 & 1) == 0 || !CacheAlign[10] )
return *(_DWORD *)&PspResourceFlags[8 * v4 + 4];
v21 = _InterlockedExchange64((volatile __int64 *)CacheAlign + 9, 0i64);
if( v21 )
{
v10 = v21 + _InterlockedExchangeAdd64((volatile signed __int64 *)CacheAlign + 8, v21);
goto LABEL_3;
}
if( !PspExpandQuota((_PS_RESOURCE_TYPE)v4, (_PSP_QUOTA_ENTRY *)CacheAlign, v9, Amount, &pLimit) )
return *(_DWORD *)&PspResourceFlags[8 * v4 + 4];
}
v13 = _InterlockedCompareExchange64((volatile signed __int64 *)CacheAlign, v11, v9);
v12 = v9 == v13;
v9 = v13;
if( !v12 )
continue;
break;
}
_m_prefetchw(CacheAlign + 1);
v14 = CacheAlign[1];
if( v11 > v14 )
{
do
{
v20 = v14;
v14 = _InterlockedCompareExchange64((volatile signed __int64 *)CacheAlign + 1, v11, v14);
}
while( v14 != v20 && v11 > v14 );
}
if( Process )
{
if( (v8 & 4) != 0 )
{
v16 = Amount + _InterlockedExchangeAdd64((volatile signed __int64 *)&Process->ProcessQuotaUsage[v4], Amount);
v17 = &Process->Pcb.gap0[8 * v4];
_m_prefetchw(v17 + 1152);
v18 = *((_QWORD *)v17 + 144);
if( v16 > v18 )
{
do
{
v19 = v18;
v18 = _InterlockedCompareExchange64((volatile signed __int64 *)v17 + 144, v16, v18);
}
while( v18 != v19 && v16 > v18 );
}
}
}
return 0;
}Referenced by:
MiChargeFullProcessCommitment
MiInsertVadCharges
ObpIncrementHandleCountEx
PsChargeProcessNonPagedPoolQuota
PsChargeProcessPagedPoolQuota
PsChargeProcessPoolQuota
PsChargeProcessQuota
PsChargeSharedPoolQuota