public void GetBinaryForm(byte[] binaryForm, int offset)
{
if (binaryForm == null)
{
throw new ArgumentNullException(nameof(binaryForm));
}
if (offset < 0)
{
throw new ArgumentOutOfRangeException(nameof(offset),
SR.ArgumentOutOfRange_NeedNonNegNum);
}
if (binaryForm.Length - offset < BinaryLength)
{
throw new ArgumentOutOfRangeException(
nameof(binaryForm),
SR.ArgumentOutOfRange_ArrayTooSmall);
}
Contract.EndContractBlock();
//
// the offset will grow as we go for each additional field (owner, group,
// acl, etc) being written. But for each of such fields, we must use the
// original offset as passed in, not the growing offset
//
int originalOffset = offset;
//
// Populate the header
//
int length = BinaryLength;
byte rmControl =
((this is RawSecurityDescriptor) &&
((ControlFlags & ControlFlags.RMControlValid) != 0)) ? ((this as RawSecurityDescriptor).ResourceManagerControl) : (byte)0;
// if the DACL is our internally crafted NULL replacement, then let us turn off this control
int materializedControlFlags = (int)ControlFlags;
if (IsCraftedAefaDacl)
{
unchecked { materializedControlFlags &= ~((int)ControlFlags.DiscretionaryAclPresent); }
}
binaryForm[offset + 0] = Revision;
binaryForm[offset + 1] = rmControl;
binaryForm[offset + 2] = (byte)((int)materializedControlFlags >> 0);
binaryForm[offset + 3] = (byte)((int)materializedControlFlags >> 8);
//
// Compute offsets at which owner, group, SACL and DACL are stored
//
int ownerOffset, groupOffset, saclOffset, daclOffset;
ownerOffset = offset + OwnerFoundAt;
groupOffset = offset + GroupFoundAt;
saclOffset = offset + SaclFoundAt;
daclOffset = offset + DaclFoundAt;
offset += HeaderLength;
//
// Marhsal the Owner SID into place
//
if (Owner != null)
{
MarshalInt(binaryForm, ownerOffset, offset - originalOffset);
Owner.GetBinaryForm(binaryForm, offset);
offset += Owner.BinaryLength;
}
else
{
//
// If Owner SID is null, store 0 in the offset field
//
MarshalInt(binaryForm, ownerOffset, 0);
}
//
// Marshal the Group SID into place
//
if (Group != null)
{
MarshalInt(binaryForm, groupOffset, offset - originalOffset);
Group.GetBinaryForm(binaryForm, offset);
offset += Group.BinaryLength;
}
else
{
//
// If Group SID is null, store 0 in the offset field
//
MarshalInt(binaryForm, groupOffset, 0);
}
//
// Marshal the SACL into place, if present
//
if ((ControlFlags & ControlFlags.SystemAclPresent) != 0 &&
GenericSacl != null)
{
MarshalInt(binaryForm, saclOffset, offset - originalOffset);
GenericSacl.GetBinaryForm(binaryForm, offset);
offset += GenericSacl.BinaryLength;
}
else
{
//
// If SACL is null or not present, store 0 in the offset field
//
MarshalInt(binaryForm, saclOffset, 0);
}
//
// Marshal the DACL into place, if present
//
if ((ControlFlags & ControlFlags.DiscretionaryAclPresent) != 0 &&
GenericDacl != null && !IsCraftedAefaDacl)
{
MarshalInt(binaryForm, daclOffset, offset - originalOffset);
GenericDacl.GetBinaryForm(binaryForm, offset);
offset += GenericDacl.BinaryLength;
}
else
{
//
// If DACL is null or not present, store 0 in the offset field
//
MarshalInt(binaryForm, daclOffset, 0);
}
}
#endregion