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