ObpChargeQuotaForObject
INT64 __fastcall ObpChargeQuotaForObject(_OBJECT_HEADER *ObjectHeader, _EPROCESS *Process, VOID *SecurityDescriptor){
unsigned int v3;
INT64 v6;
void *v7;
unsigned __int8 Flags;
unsigned int v9;
unsigned int v10;
unsigned __int64 v11;
INT64 result;
INT64 v13;
_OBJECT_CREATE_INFORMATION *v14;
__int64 v15;
void *v16;
UINT64 Size;
v3 = 0;
LODWORD(Size) = 0;
v6 = OBJECT_HEADER_TO_QUOTA_INFO((INT64)ObjectHeader);
Flags = ObjectHeader->Flags;
if( (Flags & 1) == 0 )
return 0i64;
ObjectHeader->Flags = Flags & 0xFE;
if( v6 )
{
v9 = *(_DWORD *)v6;
v10 = *(_DWORD *)(v6 + 4);
if( v7
|| (v11 = (unsigned __int64)ObjectHeader->SecurityDescriptor) != 0
&& (v7 = (void *)(v11 & 0xFFFFFFFFFFFFFFF0ui64)) != 0i64 )
{
LODWORD(result) = SeComputeQuotaInformationSize(v7, &Size);
if( (int)result < 0 )
return result;
v3 = Size;
if( (_DWORD)Size )
{
v13 = PsChargeSharedPoolQuota((__int64)Process, (unsigned int)Size, 0i64);
*(_QWORD *)(v6 + 16) = v13;
if( !v13 )
return 3221225540i64;
}
*(_DWORD *)(v6 + 8) = v3;
}
}
else
{
v15 = ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ ObjectHeader->TypeIndex ^ (unsigned __int64)BYTE1(ObjectHeader)];
v9 = *(_DWORD *)(v15 + 104);
v10 = *(_DWORD *)(v15 + 108);
}
v14 = (_OBJECT_CREATE_INFORMATION *)PsChargeSharedPoolQuota((__int64)Process, v9, v10);
ObjectHeader->ObjectCreateInfo = v14;
if( !v14 )
{
if( v6 )
{
v16 = *(void **)(v6 + 16);
if( v16 )
PsReturnSharedPoolQuota(v16, v3, 0i64);
}
return 3221225540i64;
}
return 0i64;
}Referenced by:
ObInsertObjectEx