|
@@ -6,7 +6,6 @@
|
|
|
*/
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
-using System.Text;
|
|
|
using Utilities;
|
|
|
|
|
|
namespace SMBLibrary
|
|
@@ -16,13 +15,15 @@ namespace SMBLibrary
|
|
|
/// </summary>
|
|
|
public class SecurityDescriptor
|
|
|
{
|
|
|
+ public const int FixedLength = 20;
|
|
|
+
|
|
|
public byte Revision;
|
|
|
public byte Sbz1;
|
|
|
- public ushort Control;
|
|
|
- //uint OffsetOwner;
|
|
|
- //uint OffsetGroup;
|
|
|
- //uint OffsetSacl;
|
|
|
- //uint OffsetDacl;
|
|
|
+ public SecurityDescriptorControl Control;
|
|
|
+ // uint OffsetOwner;
|
|
|
+ // uint OffsetGroup;
|
|
|
+ // uint OffsetSacl;
|
|
|
+ // uint OffsetDacl;
|
|
|
public SID OwnerSid;
|
|
|
public SID GroupSid;
|
|
|
public ACL Sacl;
|
|
@@ -37,7 +38,7 @@ namespace SMBLibrary
|
|
|
{
|
|
|
Revision = ByteReader.ReadByte(buffer, ref offset);
|
|
|
Sbz1 = ByteReader.ReadByte(buffer, ref offset);
|
|
|
- Control = LittleEndianReader.ReadUInt16(buffer, ref offset);
|
|
|
+ Control = (SecurityDescriptorControl)LittleEndianReader.ReadUInt16(buffer, ref offset);
|
|
|
uint offsetOwner = LittleEndianReader.ReadUInt32(buffer, ref offset);
|
|
|
uint offsetGroup = LittleEndianReader.ReadUInt32(buffer, ref offset);
|
|
|
uint offsetSacl = LittleEndianReader.ReadUInt32(buffer, ref offset);
|
|
@@ -65,14 +66,93 @@ namespace SMBLibrary
|
|
|
|
|
|
public byte[] GetBytes()
|
|
|
{
|
|
|
- throw new NotImplementedException();
|
|
|
+ byte[] buffer = new byte[Length];
|
|
|
+ uint offsetOwner = 0;
|
|
|
+ uint offsetGroup = 0;
|
|
|
+ uint offsetSacl = 0;
|
|
|
+ uint offsetDacl = 0;
|
|
|
+ int offset = FixedLength;
|
|
|
+ if (OwnerSid != null)
|
|
|
+ {
|
|
|
+ offsetOwner = (uint)offset;
|
|
|
+ offset += OwnerSid.Length;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (GroupSid != null)
|
|
|
+ {
|
|
|
+ offsetGroup = (uint)offset;
|
|
|
+ offset += GroupSid.Length;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Sacl != null)
|
|
|
+ {
|
|
|
+ offsetSacl = (uint)offset;
|
|
|
+ offset += Sacl.Length;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Dacl != null)
|
|
|
+ {
|
|
|
+ offsetDacl = (uint)offset;
|
|
|
+ offset += Dacl.Length;
|
|
|
+ }
|
|
|
+
|
|
|
+ offset = 0;
|
|
|
+ ByteWriter.WriteByte(buffer, ref offset, Revision);
|
|
|
+ ByteWriter.WriteByte(buffer, ref offset, Sbz1);
|
|
|
+ LittleEndianWriter.WriteUInt16(buffer, ref offset, (ushort)Control);
|
|
|
+ LittleEndianWriter.WriteUInt32(buffer, ref offset, offsetOwner);
|
|
|
+ LittleEndianWriter.WriteUInt32(buffer, ref offset, offsetGroup);
|
|
|
+ LittleEndianWriter.WriteUInt32(buffer, ref offset, offsetSacl);
|
|
|
+ LittleEndianWriter.WriteUInt32(buffer, ref offset, offsetDacl);
|
|
|
+ if (OwnerSid != null)
|
|
|
+ {
|
|
|
+ OwnerSid.WriteBytes(buffer, ref offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (GroupSid != null)
|
|
|
+ {
|
|
|
+ GroupSid.WriteBytes(buffer, ref offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Sacl != null)
|
|
|
+ {
|
|
|
+ Sacl.WriteBytes(buffer, ref offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Dacl != null)
|
|
|
+ {
|
|
|
+ Dacl.WriteBytes(buffer, ref offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ return buffer;
|
|
|
}
|
|
|
|
|
|
public int Length
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
- throw new NotImplementedException();
|
|
|
+ int length = FixedLength;
|
|
|
+ if (OwnerSid != null)
|
|
|
+ {
|
|
|
+ length += OwnerSid.Length;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (GroupSid != null)
|
|
|
+ {
|
|
|
+ length += GroupSid.Length;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Sacl != null)
|
|
|
+ {
|
|
|
+ length += Sacl.Length;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Dacl != null)
|
|
|
+ {
|
|
|
+ length += Dacl.Length;
|
|
|
+ }
|
|
|
+
|
|
|
+ return length;
|
|
|
}
|
|
|
}
|
|
|
}
|