SeComputeCreatorDeniedRights

UINT64 __stdcall SeComputeCreatorDeniedRights(
        _SECURITY_SUBJECT_CONTEXT *Context,
        _ACCESS_STATE *AccessState,
        UINT64 CurrentAccess,
        VOID *ObjectSecurityDescriptor){
  int v5; 
  unsigned int v7; 
  __int64 v9; 
  __int16 v10; 
  __int64 v11; 
  _ACL *v12; 
  UINT8 v13; 
  __int64 v14; 
  _ACL *v15; 
  void *ClientToken; 
  VOID *ScopedPolicySid; 
  NTSTATUS Cap; 
  _RTL_DYNAMIC_HASH_TABLE_ENTRY *v19; 
  _KPROCESSOR_MODE AccessMode; 
  unsigned int GrantedAccess; 
  _RTL_DYNAMIC_HASH_TABLE_ENTRY *a2; 
  int AccessStatus; 

  AccessStatus = 0;
  v5 = CurrentAccess;
  GrantedAccess = 0;
  v7 = 0;
  if( (CurrentAccess & 0xC0000) == 0 )
    return 0i64;
  v9 = *((_QWORD *)AccessState + 9);
  if( *(_QWORD *)(v9 + 48) )
    ObjectSecurityDescriptor = *(VOID **)(v9 + 48);
  if( !ObjectSecurityDescriptor )
  {
    ObjectSecurityDescriptor = (VOID *)*((_QWORD *)AccessState + 8);
    if( !ObjectSecurityDescriptor )
      return 0i64;
  }
  v10 = *((_WORD *)ObjectSecurityDescriptor + 1);
  if( (v10 & 4) != 0 )
  {
    if( v10 >= 0 )
    {
      v12 = (_ACL *)*((_QWORD *)ObjectSecurityDescriptor + 4);
    }
    else
    {
      v11 = *((unsigned int *)ObjectSecurityDescriptor + 4);
      v12 = (_DWORD)v11 ? (_ACL *)((char *)ObjectSecurityDescriptor + v11) : 0i64;
    }
  }
  else
  {
    v12 = 0i64;
  }
  if( !RtlpOwnerAcesPresent(0, v12) )
  {
    if( (v10 & 0x10) != 0 )
    {
      if( v10 >= 0 )
      {
        v15 = (_ACL *)*((_QWORD *)ObjectSecurityDescriptor + 3);
      }
      else
      {
        v14 = *((unsigned int *)ObjectSecurityDescriptor + 3);
        v15 = (_DWORD)v14 ? (_ACL *)((char *)ObjectSecurityDescriptor + v14) : 0i64;
      }
    }
    else
    {
      v15 = 0i64;
    }
    a2 = 0i64;
    if( !SepRmEnforceCap )
      return 0i64;
    if( !v15 )
      return 0i64;
    ScopedPolicySid = SepGetScopedPolicySid(v15);
    if( !ScopedPolicySid )
      return 0i64;
    Cap = SepRmReferenceFindCap(ScopedPolicySid, (_SEP_CENTRALIZED_ACCESS_POLICY **)&a2);
    v19 = a2;
    if( Cap < 0 )
      v19 = (_RTL_DYNAMIC_HASH_TABLE_ENTRY *)SepRmDefaultCap;
    if( ((__int64)v19[2].Linkage.Blink & 1) == 0 )
      return 0i64;
  }
  ClientToken = Context->ClientToken;
  if( !Context->ClientToken )
    ClientToken = Context->PrimaryToken;
  if( !SepTokenIsOwner(ClientToken, ObjectSecurityDescriptor, v13) )
    return 0i64;
  if( (v5 & 0x40000) != 0 )
  {
    LOBYTE(AccessMode) = KeGetCurrentThread()->PreviousMode;
    if( !(unsigned __int8)SeAccessCheck(
                             ObjectSecurityDescriptor,
                             Context,
                             1u,
                             0x40000,
                             0,
                             0i64,
                             (PGENERIC_MAPPING)&StandardBitMapping,
                             AccessMode,
                             &GrantedAccess,
                             &AccessStatus) )
      v7 = 0x40000;
  }
  if( (v5 & 0x80000) != 0 )
  {
    LOBYTE(AccessMode) = KeGetCurrentThread()->PreviousMode;
    if( !(unsigned __int8)SeAccessCheck(
                             ObjectSecurityDescriptor,
                             Context,
                             1u,
                             0x80000,
                             0,
                             0i64,
                             (PGENERIC_MAPPING)&StandardBitMapping,
                             AccessMode,
                             &GrantedAccess,
                             &AccessStatus) )
      v7 |= 0x80000u;
  }
  return v7;
}

Referenced by:

ObpAdjustCreatorAccessState
ObpCreateHandle