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