Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
RawSecurityDescriptor.cs
Go to the documentation of this file.
4
6
8{
10
12
14
15 private RawAcl _sacl;
16
17 private RawAcl _dacl;
18
19 private byte _rmControl;
20
21 internal override GenericAcl? GenericSacl => _sacl;
22
23 internal override GenericAcl? GenericDacl => _dacl;
24
25 public override ControlFlags ControlFlags => _flags;
26
27 public override SecurityIdentifier? Owner
28 {
29 get
30 {
31 return _owner;
32 }
33 set
34 {
35 _owner = value;
36 }
37 }
38
39 public override SecurityIdentifier? Group
40 {
41 get
42 {
43 return _group;
44 }
45 set
46 {
47 _group = value;
48 }
49 }
50
52 {
53 get
54 {
55 return _sacl;
56 }
57 set
58 {
59 _sacl = value;
60 }
61 }
62
64 {
65 get
66 {
67 return _dacl;
68 }
69 set
70 {
71 _dacl = value;
72 }
73 }
74
76 {
77 get
78 {
79 return _rmControl;
80 }
81 set
82 {
84 }
85 }
86
87 private void CreateFromParts(ControlFlags flags, SecurityIdentifier owner, SecurityIdentifier group, RawAcl systemAcl, RawAcl discretionaryAcl)
88 {
89 SetFlags(flags);
90 Owner = owner;
91 Group = group;
92 SystemAcl = systemAcl;
93 DiscretionaryAcl = discretionaryAcl;
95 }
96
97 public RawSecurityDescriptor(ControlFlags flags, SecurityIdentifier? owner, SecurityIdentifier? group, RawAcl? systemAcl, RawAcl? discretionaryAcl)
98 {
99 CreateFromParts(flags, owner, group, systemAcl, discretionaryAcl);
100 }
101
102 public RawSecurityDescriptor(string sddlForm)
103 : this(BinaryFormFromSddlForm(sddlForm), 0)
104 {
105 }
106
107 public RawSecurityDescriptor(byte[] binaryForm, int offset)
108 {
109 if (binaryForm == null)
110 {
111 throw new ArgumentNullException("binaryForm");
112 }
113 if (offset < 0)
114 {
116 }
117 if (binaryForm.Length - offset < 20)
118 {
120 }
121 if (binaryForm[offset] != GenericSecurityDescriptor.Revision)
122 {
124 }
125 byte resourceManagerControl = binaryForm[offset + 1];
126 ControlFlags controlFlags = (ControlFlags)(binaryForm[offset + 2] + (binaryForm[offset + 3] << 8));
127 if ((controlFlags & ControlFlags.SelfRelative) == 0)
128 {
130 }
131 int num = GenericSecurityDescriptor.UnmarshalInt(binaryForm, offset + 4);
132 SecurityIdentifier owner = ((num == 0) ? null : new SecurityIdentifier(binaryForm, offset + num));
133 int num2 = GenericSecurityDescriptor.UnmarshalInt(binaryForm, offset + 8);
134 SecurityIdentifier group = ((num2 == 0) ? null : new SecurityIdentifier(binaryForm, offset + num2));
135 int num3 = GenericSecurityDescriptor.UnmarshalInt(binaryForm, offset + 12);
136 RawAcl systemAcl = (((controlFlags & ControlFlags.SystemAclPresent) == 0 || num3 == 0) ? null : new RawAcl(binaryForm, offset + num3));
137 int num4 = GenericSecurityDescriptor.UnmarshalInt(binaryForm, offset + 16);
138 CreateFromParts(controlFlags, owner, group, systemAcl, ((controlFlags & ControlFlags.DiscretionaryAclPresent) == 0 || num4 == 0) ? null : new RawAcl(binaryForm, offset + num4));
139 if ((controlFlags & ControlFlags.RMControlValid) != 0)
140 {
141 ResourceManagerControl = resourceManagerControl;
142 }
143 }
144
145 private static byte[] BinaryFormFromSddlForm(string sddlForm)
146 {
147 if (sddlForm == null)
148 {
149 throw new ArgumentNullException("sddlForm");
150 }
151 IntPtr resultSd = IntPtr.Zero;
152 uint resultSdLength = 0u;
153 byte[] array = null;
154 try
155 {
156 if (!global::Interop.Advapi32.ConvertStringSdToSd(sddlForm, GenericSecurityDescriptor.Revision, out resultSd, ref resultSdLength))
157 {
158 int lastWin32Error = Marshal.GetLastWin32Error();
159 switch (lastWin32Error)
160 {
161 case 87:
162 case 1305:
163 case 1336:
164 case 1338:
166 case 8:
167 throw new OutOfMemoryException();
168 case 1337:
170 default:
171 throw new Win32Exception(lastWin32Error, System.SR.Format(System.SR.AccessControl_UnexpectedError, lastWin32Error));
172 case 0:
173 break;
174 }
175 }
176 array = new byte[resultSdLength];
177 Marshal.Copy(resultSd, array, 0, (int)resultSdLength);
178 return array;
179 }
180 finally
181 {
182 if (resultSd != IntPtr.Zero)
183 {
184 Marshal.FreeHGlobal(resultSd);
185 }
186 }
187 }
188
189 public void SetFlags(ControlFlags flags)
190 {
191 _flags = flags | ControlFlags.SelfRelative;
192 }
193}
static void FreeHGlobal(IntPtr hglobal)
Definition Marshal.cs:1680
static void Copy(int[] source, int startIndex, IntPtr destination, int length)
Definition Marshal.cs:800
static string AccessControl_InvalidSecurityDescriptorRevision
Definition SR.cs:26
static string AccessControl_UnexpectedError
Definition SR.cs:42
static string AccessControl_InvalidSidInSDDLString
Definition SR.cs:30
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string AccessControl_InvalidSecurityDescriptorSelfRelativeForm
Definition SR.cs:28
static string ArgumentOutOfRange_ArrayTooSmall
Definition SR.cs:74
static string ArgumentException_InvalidSDSddlForm
Definition SR.cs:68
static string ArgumentOutOfRange_NeedNonNegNum
Definition SR.cs:32
Definition SR.cs:7
RawSecurityDescriptor(ControlFlags flags, SecurityIdentifier? owner, SecurityIdentifier? group, RawAcl? systemAcl, RawAcl? discretionaryAcl)
void CreateFromParts(ControlFlags flags, SecurityIdentifier owner, SecurityIdentifier group, RawAcl systemAcl, RawAcl discretionaryAcl)
static readonly IntPtr Zero
Definition IntPtr.cs:18