ObpChargeQuotaForObject
NTSTATUS __stdcall ObpChargeQuotaForObject(_OBJECT_HEADER *ObjectHeader, _EPROCESS *Process, VOID *SecurityDescriptor){
ULONG_PTR v3;
_OBJECT_HEADER_QUOTA_INFO *v6;
VOID *v7;
unsigned __int8 Flags;
unsigned int PagedPoolCharge;
unsigned int NonPagedPoolCharge;
unsigned __int64 v11;
NTSTATUS result;
VOID *v13;
_OBJECT_CREATE_INFORMATION *v14;
__int64 v15;
VOID *SecurityDescriptorQuotaBlock;
UINT64 Size;
v3 = 0;
LODWORD(Size) = 0;
v6 = OBJECT_HEADER_TO_QUOTA_INFO(ObjectHeader);
Flags = ObjectHeader->Flags;
if( (Flags & 1) == 0 )
return 0;
ObjectHeader->Flags = Flags & 0xFE;
if( v6 )
{
PagedPoolCharge = v6->PagedPoolCharge;
NonPagedPoolCharge = v6->NonPagedPoolCharge;
if( v7
|| (v11 = (unsigned __int64)ObjectHeader->SecurityDescriptor) != 0
&& (v7 = (VOID *)(v11 & 0xFFFFFFFFFFFFFFF0ui64)) != 0i64 )
{
result = SeComputeQuotaInformationSize(v7, &Size);
if( result < 0 )
return result;
v3 = Size;
if( (_DWORD)Size )
{
v13 = PsChargeSharedPoolQuota(Process, (unsigned int)Size, 0i64);
v6->SecurityDescriptorQuotaBlock = v13;
if( !v13 )
return -1073741756;
}
v6->SecurityDescriptorCharge = v3;
}
}
else
{
v15 = ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ ObjectHeader->TypeIndex ^ (unsigned __int64)BYTE1(ObjectHeader)];
PagedPoolCharge = *(_DWORD *)(v15 + 104);
NonPagedPoolCharge = *(_DWORD *)(v15 + 108);
}
v14 = (_OBJECT_CREATE_INFORMATION *)PsChargeSharedPoolQuota(Process, PagedPoolCharge, NonPagedPoolCharge);
ObjectHeader->ObjectCreateInfo = v14;
if( !v14 )
{
if( v6 )
{
SecurityDescriptorQuotaBlock = v6->SecurityDescriptorQuotaBlock;
if( SecurityDescriptorQuotaBlock )
PsReturnSharedPoolQuota(SecurityDescriptorQuotaBlock, v3, 0);
}
return -1073741756;
}
return 0;
}Referenced by:
ObInsertObjectEx