/// <summary>使用指定的字节值数组初始化 <see cref="T:System.Security.AccessControl.RawSecurityDescriptor" /> 类的新实例。</summary>
/// <param name="binaryForm">用于创建新的 <see cref="T:System.Security.AccessControl.RawSecurityDescriptor" /> 对象的字节值数组。</param>
/// <param name="offset">
/// <paramref name="binaryForm" /> 数组中第一个要复制的元素的偏移量。</param>
public RawSecurityDescriptor(byte[] binaryForm, int offset)
{
if (binaryForm == null)
{
throw new ArgumentNullException("binaryForm");
}
if (offset < 0)
{
throw new ArgumentOutOfRangeException("offset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
}
if (binaryForm.Length - offset < 20)
{
throw new ArgumentOutOfRangeException("binaryForm", Environment.GetResourceString("ArgumentOutOfRange_ArrayTooSmall"));
}
if ((int)binaryForm[offset + 0] != (int)GenericSecurityDescriptor.Revision)
{
throw new ArgumentOutOfRangeException("binaryForm", Environment.GetResourceString("AccessControl_InvalidSecurityDescriptorRevision"));
}
byte num1 = binaryForm[offset + 1];
ControlFlags flags = (ControlFlags)((int)binaryForm[offset + 2] + ((int)binaryForm[offset + 3] << 8));
if ((flags & ControlFlags.SelfRelative) == ControlFlags.None)
{
throw new ArgumentException(Environment.GetResourceString("AccessControl_InvalidSecurityDescriptorSelfRelativeForm"), "binaryForm");
}
int num2 = GenericSecurityDescriptor.UnmarshalInt(binaryForm, offset + 4);
SecurityIdentifier owner = num2 == 0 ? (SecurityIdentifier)null : new SecurityIdentifier(binaryForm, offset + num2);
int num3 = GenericSecurityDescriptor.UnmarshalInt(binaryForm, offset + 8);
SecurityIdentifier group = num3 == 0 ? (SecurityIdentifier)null : new SecurityIdentifier(binaryForm, offset + num3);
int num4 = GenericSecurityDescriptor.UnmarshalInt(binaryForm, offset + 12);
RawAcl systemAcl = (flags & ControlFlags.SystemAclPresent) == ControlFlags.None || num4 == 0 ? (RawAcl)null : new RawAcl(binaryForm, offset + num4);
int num5 = GenericSecurityDescriptor.UnmarshalInt(binaryForm, offset + 16);
RawAcl discretionaryAcl = (flags & ControlFlags.DiscretionaryAclPresent) == ControlFlags.None || num5 == 0 ? (RawAcl)null : new RawAcl(binaryForm, offset + num5);
this.CreateFromParts(flags, owner, group, systemAcl, discretionaryAcl);
if ((flags & ControlFlags.RMControlValid) == ControlFlags.None)
{
return;
}
this.ResourceManagerControl = num1;
}