53 public sealed override int Count
93 for (
int i = 0; i <
array.Length; i++)
98 array[4] = PM.F | PM.CO |
PM.GO;
102 array[8] = PM.F | PM.CF |
PM.GF;
106 array[12] = PM.F | PM.CF | PM.CO | PM.GF |
PM.GO;
107 array[13] = PM.F | PM.CF |
PM.CO;
108 array[14] = PM.CF | PM.CO | PM.GF |
PM.GO;
116 for (
int i = 0; i <
array.Length; i++)
124 array[4] = AF.OI | AF.IO |
AF.NP;
128 array[8] = AF.CI | AF.IO |
AF.NP;
130 array[28] = AF.CI | AF.OI |
AF.NP;
131 array[15] = AF.CI | AF.OI |
AF.IO;
132 array[12] = AF.CI | AF.OI | AF.IO |
AF.NP;
139 if ((aceFlags &
AceFlags.ContainerInherit) != 0)
143 if (!isDS && (aceFlags &
AceFlags.ObjectInherit) != 0)
147 if ((aceFlags &
AceFlags.InheritOnly) != 0)
151 if ((aceFlags &
AceFlags.NoPropagateInherit) != 0)
161 if ((af &
AF.CI) != 0)
163 aceFlags |=
AceFlags.ContainerInherit;
165 if (!isDS && (af &
AF.OI) != 0)
169 if ((af &
AF.IO) != 0)
173 if ((af &
AF.NP) != 0)
175 aceFlags |=
AceFlags.NoPropagateInherit;
187 if (pM ==
PM.GO || pM2 ==
PM.GO)
209 if (pM ==
PM.GO || pM2 ==
PM.GO)
247 case AceType.AccessDeniedCallback:
249 case AceType.AccessDeniedObject:
250 case AceType.AccessDeniedCallbackObject:
253 case AceType.AccessAllowedCallback:
255 case AceType.AccessAllowedObject:
256 case AceType.AccessAllowedCallbackObject:
274 case AceType.SystemAuditCallback:
275 case AceType.SystemAlarmCallback:
277 case AceType.SystemAuditObject:
278 case AceType.SystemAlarmObject:
279 case AceType.SystemAuditCallbackObject:
280 case AceType.SystemAlarmCallbackObject:
301 int num3 = knownAce.SecurityIdentifier.CompareTo(knownAce2.SecurityIdentifier);
314 private void QuickSort(
int left,
int right,
bool isDacl)
326 while (
CompareAces(
_acl[right], genericAce, isDacl) != 0 && left < right)
345 _acl[left] = genericAce;
362 if (knownAce !=
null && knownAce.
AccessMask == 0)
368 if ((ace.AceFlags &
AceFlags.InheritOnly) != 0)
372 if ((ace.AceFlags &
AceFlags.InheritanceFlags) != 0)
379 if ((ace.AceFlags &
AceFlags.InheritOnly) != 0 && (ace.AceFlags &
AceFlags.ContainerInherit) == 0 && (ace.AceFlags &
AceFlags.ObjectInherit) == 0)
383 if ((ace.AceFlags &
AceFlags.NoPropagateInherit) != 0 && (ace.AceFlags &
AceFlags.ContainerInherit) == 0 && (ace.AceFlags &
AceFlags.ObjectInherit) == 0)
385 ace.AceFlags &=
~AceFlags.NoPropagateInherit;
399 if ((ace.AceFlags &
AceFlags.AuditFlags) == 0)
413 for (
int num =
_acl.
Count - 1; num >= 0; num--)
425 for (ushort num = 0; num <
_acl.
Count; num++)
427 _acl[num]._indexInAcl = num;
434 for (
int i = 0; i <
Count - 1; i++)
440 if (!(qualifiedAce ==
null) &&
MergeAces(ref ace, qualifiedAce))
453 if (((uint)accessMask & 0x13Bu) != 0)
456 objectFlags |= originalAce.ObjectAceFlags &
ObjectAceFlags.ObjectAceTypePresent;
458 if ((aceFlags &
AceFlags.ContainerInherit) != 0)
461 objectFlags |= originalAce.ObjectAceFlags &
ObjectAceFlags.InheritedObjectAceTypePresent;
500 if ((objectAceFlags &
ObjectAceFlags.InheritedObjectAceTypePresent) == 0)
509 if (((uint)(ace.
AccessMask & accessMask) & 0x13Bu) != 0)
518 if ((objectFlags &
ObjectAceFlags.ObjectAceTypePresent) != 0 && !objectAce.ObjectTypesMatch(objectFlags, objectType))
523 else if ((objectFlags &
ObjectAceFlags.ObjectAceTypePresent) != 0)
538 if ((objectFlags &
ObjectAceFlags.InheritedObjectAceTypePresent) != 0 && (objectAce.ObjectAceFlags &
ObjectAceFlags.InheritedObjectAceTypePresent) == 0)
542 if ((objectFlags &
ObjectAceFlags.InheritedObjectAceTypePresent) != 0 && !objectAce.InheritedObjectTypesMatch(objectFlags, inheritedObjectType))
547 else if ((objectFlags &
ObjectAceFlags.InheritedObjectAceTypePresent) != 0)
559 if (opaque ==
null || opaque2 ==
null)
561 return opaque == opaque2;
563 if (opaque.Length != opaque2.Length)
567 for (
int i = 0; i < opaque.Length; i++)
569 if (opaque[i] != opaque2[i])
612 if (ace.AceFlags == newAce.
AceFlags)
629 ace.AceFlags |= newAce.AceFlags &
AceFlags.AuditFlags;
634 ace.AceFlags |= newAce.AceFlags &
AceFlags.AuditFlags;
645 ace.AceFlags = result | (ace.AceFlags &
AceFlags.AuditFlags);
651 ace.AceFlags = result | (ace.AceFlags &
AceFlags.AuditFlags);
674 if (qualifiedAce ==
null)
707 if (genericAce2 ==
null)
719 if (qualifiedAce2 ==
null)
733 else if (num4 < num3)
758 internal CommonAcl(
bool isContainer,
bool isDS,
RawAcl rawAcl,
bool trusted,
bool isDacl)
774 for (
int i = 0; i < rawAcl.
Count; i++)
812 if (inheritanceFlags != 0)
816 if (propagationFlags != 0)
838 GenericAce ace = ((
IsDS && objectFlags != 0) ? ((
QualifiedAce)
new ObjectAce(flags, qualifier, accessMask, sid, objectFlags, objectType, inheritedObjectType, isCallback:
false,
null)) : ((
QualifiedAce)
new CommonAce(flags, qualifier, accessMask, sid, isCallback:
false,
null)));
843 for (
int i = 0; i <
Count; i++)
875 GenericAce ace = ((
IsDS && objectFlags != 0) ? ((
QualifiedAce)
new ObjectAce(flags, qualifier, accessMask, sid, objectFlags, objectType, inheritedObjectType, isCallback:
false,
null)) : ((
QualifiedAce)
new CommonAce(flags, qualifier, accessMask, sid, isCallback:
false,
null)));
880 for (
int i = 0; i <
Count; i++)
911 int num = accessMask;
919 for (
int i = 0; i <
Count; i++)
930 if ((qualifiedAce.
AccessMask & accessMask) == 0)
946 else if ((qualifiedAce.
AccessMask & accessMask) == 0)
950 if (saclSemantics && (qualifiedAce.
AceFlags & flags &
AceFlags.AuditFlags) == 0)
972 num2 = qualifiedAce.AccessMask & ~accessMask;
973 if (qualifiedAce is
ObjectAce originalAce)
975 GetObjectTypesForSplit(originalAce, num2, aceFlags2, out objectFlags2, out objectType2, out inheritedObjectType2);
979 aceFlags3 = qualifiedAce.AceFlags & (
AceFlags)(~(uint)(flags &
AceFlags.AuditFlags));
980 accessMask2 = qualifiedAce.AccessMask & accessMask;
981 if (qualifiedAce is
ObjectAce originalAce2)
983 GetObjectTypesForSplit(originalAce2, accessMask2, aceFlags3, out objectFlags3, out objectType3, out inheritedObjectType3);
986 aceFlags4 = (qualifiedAce.AceFlags &
AceFlags.InheritanceFlags) | (flags & qualifiedAce.
AceFlags &
AceFlags.AuditFlags);
987 num3 = qualifiedAce.AccessMask & accessMask;
988 if (!saclSemantics || (aceFlags4 &
AceFlags.AuditFlags) != 0)
997 result |= aceFlags4 &
AceFlags.AuditFlags;
998 if (qualifiedAce is
ObjectAce originalAce3)
1000 GetObjectTypesForSplit(originalAce3, num3, result, out objectFlags4, out objectType4, out inheritedObjectType4);
1018 qualifiedAce.AceFlags = aceFlags2;
1019 qualifiedAce.AccessMask = num2;
1020 if (qualifiedAce is
ObjectAce objectAce)
1022 objectAce.ObjectAceFlags = objectFlags2;
1023 objectAce.ObjectAceType = objectType2;
1024 objectAce.InheritedObjectAceType = inheritedObjectType2;
1033 if (saclSemantics && (aceFlags3 &
AceFlags.AuditFlags) != 0)
1035 QualifiedAce ace2 = ((!(qualifiedAce is
CommonAce)) ? ((
QualifiedAce)
new ObjectAce(aceFlags3, qualifier, accessMask2, qualifiedAce.
SecurityIdentifier, objectFlags3, objectType3, inheritedObjectType3, isCallback:
false,
null)) : ((
QualifiedAce)
new CommonAce(aceFlags3, qualifier, accessMask2, qualifiedAce.
SecurityIdentifier, isCallback:
false,
null)));
1041 QualifiedAce ace2 = ((!(qualifiedAce is
CommonAce)) ? ((
QualifiedAce)
new ObjectAce(result, qualifier, num3, qualifiedAce.
SecurityIdentifier, objectFlags4, objectType4, inheritedObjectType4, isCallback:
false,
null)) : ((
QualifiedAce)
new CommonAce(result, qualifier, num3, qualifiedAce.
SecurityIdentifier, isCallback:
false,
null)));
1052 if (!(flag && flag2))
1064 if (accessMask == 0)
1077 for (
int i = 0; i <
Count; i++)
1086 if (qualifiedAce is
ObjectAce objectAce && objectFlags != 0)
1088 if (!objectAce.ObjectTypesMatch(objectFlags, objectType) || !objectAce.InheritedObjectTypesMatch(objectFlags, inheritedObjectType))
1093 else if (qualifiedAce is
ObjectAce || objectFlags != 0)
1117 for (
int num =
_acl.
Count - 1; num >= 0; num--)
1135 for (
int num =
Count - 1; num >= 0; num--)
static string InvalidOperation_ModificationOfNonCanonicalAcl
static string ArgumentOutOfRange_Enum
static string Argument_InvalidAnyFlag
static string Arg_EnumAtLeastOneFlag
static string Argument_ArgumentZero
static string NotSupported_SetMethod
bool AceFlagsAreMergeable(QualifiedAce ace, QualifiedAce newAce)
bool InheritedObjectTypesMatch(QualifiedAce ace, QualifiedAce newAce)
CommonAcl(bool isContainer, bool isDS, byte revision, int capacity)
CommonAcl(bool isContainer, bool isDS, RawAcl rawAcl, bool trusted, bool isDacl)
bool RemoveQualifiedAces(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, bool saclSemantics, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
static AceFlags AceFlagsFromAF(AF af, bool isDS)
void RemoveQualifiedAcesSpecific(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
bool AccessMasksAreMergeable(QualifiedAce ace, QualifiedAce newAce)
readonly bool _isContainer
static AF AFFromAceFlags(AceFlags aceFlags, bool isDS)
static bool AceOpaquesMatch(QualifiedAce ace, QualifiedAce newAce)
bool ObjectTypesMatch(QualifiedAce ace, QualifiedAce newAce)
bool CanonicalCheck(bool isDacl)
void RemoveMeaninglessAcesAndFlags(bool isDacl)
static bool RemoveInheritanceBits(AceFlags existing, AceFlags remove, bool isDS, out AceFlags result, out bool total)
static readonly PM[] s_AFtoPM
void CheckFlags(InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
void CanonicalizeIfNecessary()
void AddQualifiedAce(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
bool GetInheritanceFlagsForRemoval(QualifiedAce ace, ObjectAceFlags objectFlags, Guid inheritedObjectType, ref AceFlags aceFlags)
bool GetAccessMaskForRemoval(QualifiedAce ace, ObjectAceFlags objectFlags, Guid objectType, ref int accessMask)
bool MergeAces(ref QualifiedAce ace, QualifiedAce newAce)
static AF[] CreatePMtoAFConversionMatrix()
readonly bool _isCanonical
static int SaclAcePriority(GenericAce ace)
virtual void OnAclModificationTried()
static ComparisonResult CompareAces(GenericAce ace1, GenericAce ace2, bool isDacl)
void RemoveInheritedAces()
static PM[] CreateAFtoPMConversionMatrix()
bool InspectAce(ref GenericAce ace, bool isDacl)
static int DaclAcePriority(GenericAce ace)
void Canonicalize(bool compact, bool isDacl)
override void GetBinaryForm(byte[] binaryForm, int offset)
void ThrowIfNotCanonical()
void Purge(SecurityIdentifier sid)
void CheckAccessType(AccessControlType accessType)
static bool AcesAreMergeable(QualifiedAce ace, QualifiedAce newAce)
static readonly AF[] s_PMtoAF
override int BinaryLength
void SetQualifiedAce(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
void QuickSort(int left, int right, bool isDacl)
static bool MergeInheritanceBits(AceFlags left, AceFlags right, bool isDS, out AceFlags result)
void GetObjectTypesForSplit(ObjectAce originalAce, int accessMask, AceFlags aceFlags, out ObjectAceFlags objectFlags, out Guid objectType, out Guid inheritedObjectType)
InheritanceFlags InheritanceFlags
SecurityIdentifier SecurityIdentifier
Guid InheritedObjectAceType
AceQualifier AceQualifier
override void GetBinaryForm(byte[] binaryForm, int offset)
void InsertAce(int index, GenericAce ace)
void SetBinaryForm(byte[] binaryForm, int offset)
void RemoveAce(int index)
override int BinaryLength
override bool Equals([NotNullWhen(true)] object? o)
static readonly Guid Empty