895 {
896 if (accessMask == 0)
897 {
899 }
900 if (qualifier ==
AceQualifier.SystemAudit && (flags & AceFlags.AuditFlags) == 0)
901 {
903 }
904 if (sid == null)
905 {
906 throw new ArgumentNullException("sid");
907 }
909 bool flag = true;
910 bool flag2 = true;
911 int num = accessMask;
912 AceFlags aceFlags = flags;
915 while (true)
916 {
917 try
918 {
919 for (
int i = 0;
i <
Count;
i++)
920 {
921 QualifiedAce qualifiedAce =
_acl[
i] as QualifiedAce;
922 if (qualifiedAce == null || (qualifiedAce.AceFlags & AceFlags.Inherited) != 0 || qualifiedAce.AceQualifier != qualifier || qualifiedAce.SecurityIdentifier != sid)
923 {
924 continue;
925 }
927 {
928 accessMask = num;
930 if ((qualifiedAce.AccessMask & accessMask) == 0)
931 {
932 continue;
933 }
934 flags = aceFlags;
936 if (((qualifiedAce.AceFlags & AceFlags.ContainerInherit) == 0 && (flags & AceFlags.ContainerInherit) != 0 && (flags & AceFlags.InheritOnly) != 0) || ((flags & AceFlags.ContainerInherit) == 0 && (qualifiedAce.AceFlags & AceFlags.ContainerInherit) != 0 && (qualifiedAce.AceFlags & AceFlags.InheritOnly) != 0) || ((aceFlags & AceFlags.ContainerInherit) != 0 && (aceFlags & AceFlags.InheritOnly) != 0 && (flags & AceFlags.ContainerInherit) == 0))
937 {
938 continue;
939 }
940 if (flag3 || flag4)
941 {
942 flag2 = false;
943 break;
944 }
945 }
946 else if ((qualifiedAce.AccessMask & accessMask) == 0)
947 {
948 continue;
949 }
950 if (saclSemantics && (qualifiedAce.AceFlags & flags & AceFlags.AuditFlags) == 0)
951 {
952 continue;
953 }
954 AceFlags aceFlags2 = AceFlags.None;
955 int num2 = 0;
956 ObjectAceFlags objectFlags2 = ObjectAceFlags.None;
958 Guid inheritedObjectType2 =
Guid.Empty;
959 AceFlags aceFlags3 = AceFlags.None;
960 int accessMask2 = 0;
961 ObjectAceFlags objectFlags3 = ObjectAceFlags.None;
963 Guid inheritedObjectType3 =
Guid.Empty;
964 AceFlags aceFlags4 = AceFlags.None;
965 int num3 = 0;
966 ObjectAceFlags objectFlags4 = ObjectAceFlags.None;
968 Guid inheritedObjectType4 =
Guid.Empty;
969 AceFlags result = AceFlags.None;
970 bool total = false;
971 aceFlags2 = qualifiedAce.AceFlags;
972 num2 = qualifiedAce.AccessMask & ~accessMask;
973 if (qualifiedAce is ObjectAce originalAce)
974 {
975 GetObjectTypesForSplit(originalAce, num2, aceFlags2, out objectFlags2, out objectType2, out inheritedObjectType2);
976 }
977 if (saclSemantics)
978 {
979 aceFlags3 = qualifiedAce.AceFlags & (
AceFlags)(~(uint)(flags & AceFlags.AuditFlags));
980 accessMask2 = qualifiedAce.AccessMask & accessMask;
981 if (qualifiedAce is ObjectAce originalAce2)
982 {
983 GetObjectTypesForSplit(originalAce2, accessMask2, aceFlags3, out objectFlags3, out objectType3, out inheritedObjectType3);
984 }
985 }
986 aceFlags4 = (qualifiedAce.AceFlags & AceFlags.InheritanceFlags) | (flags & qualifiedAce.AceFlags & AceFlags.AuditFlags);
987 num3 = qualifiedAce.AccessMask & accessMask;
988 if (!saclSemantics || (aceFlags4 & AceFlags.AuditFlags) != 0)
989 {
991 {
992 flag2 = false;
993 break;
994 }
995 if (!total)
996 {
997 result |= aceFlags4 & AceFlags.AuditFlags;
998 if (qualifiedAce is ObjectAce originalAce3)
999 {
1000 GetObjectTypesForSplit(originalAce3, num3, result, out objectFlags4, out objectType4, out inheritedObjectType4);
1001 }
1002 }
1003 }
1004 if (flag)
1005 {
1006 continue;
1007 }
1008 if (num2 != 0)
1009 {
1010 if (qualifiedAce is ObjectAce && (((ObjectAce)qualifiedAce).ObjectAceFlags & ObjectAceFlags.ObjectAceTypePresent) != 0 && (objectFlags2 & ObjectAceFlags.ObjectAceTypePresent) == 0)
1011 {
1013 ObjectAce ace = new ObjectAce(aceFlags2, qualifier, num2, qualifiedAce.SecurityIdentifier, objectFlags2, objectType2, inheritedObjectType2, isCallback: false, null);
1015 }
1016 else
1017 {
1018 qualifiedAce.AceFlags = aceFlags2;
1019 qualifiedAce.AccessMask = num2;
1020 if (qualifiedAce is ObjectAce objectAce)
1021 {
1022 objectAce.ObjectAceFlags = objectFlags2;
1023 objectAce.ObjectAceType = objectType2;
1024 objectAce.InheritedObjectAceType = inheritedObjectType2;
1025 }
1026 }
1027 }
1028 else
1029 {
1032 }
1033 if (saclSemantics && (aceFlags3 & AceFlags.AuditFlags) != 0)
1034 {
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)));
1038 }
1039 if (!total)
1040 {
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)));
1044 }
1045 }
1046 }
1047 catch (OverflowException)
1048 {
1050 return false;
1051 }
1052 if (!(flag && flag2))
1053 {
1054 break;
1055 }
1056 flag = false;
1057 }
1059 return flag2;
1060 }
static string Arg_EnumAtLeastOneFlag
static string Argument_ArgumentZero
static bool RemoveInheritanceBits(AceFlags existing, AceFlags remove, bool isDS, out AceFlags result, out bool total)
bool GetInheritanceFlagsForRemoval(QualifiedAce ace, ObjectAceFlags objectFlags, Guid inheritedObjectType, ref AceFlags aceFlags)
bool GetAccessMaskForRemoval(QualifiedAce ace, ObjectAceFlags objectFlags, Guid objectType, ref int accessMask)
virtual void OnAclModificationTried()
override void GetBinaryForm(byte[] binaryForm, int offset)
void ThrowIfNotCanonical()
override int BinaryLength
void GetObjectTypesForSplit(ObjectAce originalAce, int accessMask, AceFlags aceFlags, out ObjectAceFlags objectFlags, out Guid objectType, out Guid inheritedObjectType)
void InsertAce(int index, GenericAce ace)
void SetBinaryForm(byte[] binaryForm, int offset)
void RemoveAce(int index)