diff --git a/SMBLibrary/SMB1/NTTransactSubcommands/NTTransactCreateRequest.cs b/SMBLibrary/SMB1/NTTransactSubcommands/NTTransactCreateRequest.cs index 0db6d0c..c827e74 100644 --- a/SMBLibrary/SMB1/NTTransactSubcommands/NTTransactCreateRequest.cs +++ b/SMBLibrary/SMB1/NTTransactSubcommands/NTTransactCreateRequest.cs @@ -1,4 +1,4 @@ -/* Copyright (C) 2014 Tal Aloni . All rights reserved. +/* Copyright (C) 2014-2017 Tal Aloni . All rights reserved. * * You can redistribute this program and/or modify it under the terms of * the GNU Lesser Public License as published by the Free Software Foundation, @@ -34,7 +34,7 @@ namespace SMBLibrary.SMB1 public string Name; // OEM / Unicode. NOT null terminated. (MUST be aligned to start on a 2-byte boundary from the start of the NT_Trans_Parameters) // Data: public SecurityDescriptor SecurityDescriptor; - public FileFullEAInformationList ExtendedAttributes; + public List ExtendedAttributes; public NTTransactCreateRequest() { @@ -66,7 +66,7 @@ namespace SMBLibrary.SMB1 { SecurityDescriptor = new SecurityDescriptor(data, 0); } - ExtendedAttributes = new FileFullEAInformationList(data, (int)securityDescriptiorLength); + ExtendedAttributes = FileFullEAInformation.ReadList(data, (int)securityDescriptiorLength); } public override byte[] GetParameters(bool isUnicode) diff --git a/SMBLibrary/SMBLibrary.csproj b/SMBLibrary/SMBLibrary.csproj index 393972a..a6ad847 100644 --- a/SMBLibrary/SMBLibrary.csproj +++ b/SMBLibrary/SMBLibrary.csproj @@ -386,8 +386,7 @@ - - + diff --git a/SMBLibrary/Structures/FileFullEAInformation.cs b/SMBLibrary/Structures/FileFullEAInformation.cs deleted file mode 100644 index b80efc9..0000000 --- a/SMBLibrary/Structures/FileFullEAInformation.cs +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (C) 2014 Tal Aloni . All rights reserved. - * - * You can redistribute this program and/or modify it under the terms of - * the GNU Lesser Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - */ -using System; -using System.Collections.Generic; -using System.Text; -using Utilities; - -namespace SMBLibrary -{ - /// - /// [MS-FSCC] FILE_FULL_EA_INFORMATION data element - /// - public class FileFullEAInformation - { - public const int FixedLength = 8; - - public uint NextEntryOffset; - public byte Flags; - private byte EaNameLength; - private ushort EaValueLength; - public string EaName; // ASCII - public string EaValue; // ASCII - - public FileFullEAInformation() - { - } - - public FileFullEAInformation(byte[] buffer, int offset) - { - NextEntryOffset = LittleEndianReader.ReadUInt32(buffer, ref offset); - Flags = ByteReader.ReadByte(buffer, ref offset); - EaNameLength = ByteReader.ReadByte(buffer, ref offset); - EaValueLength = LittleEndianReader.ReadUInt16(buffer, ref offset); - EaName = ByteReader.ReadAnsiString(buffer, ref offset, EaNameLength); - EaValue = ByteReader.ReadAnsiString(buffer, ref offset, EaValueLength); - } - - public void WriteBytes(byte[] buffer, int offset) - { - EaNameLength = (byte)EaName.Length; - EaValueLength = (ushort)EaValue.Length; - LittleEndianWriter.WriteUInt32(buffer, ref offset, NextEntryOffset); - ByteWriter.WriteByte(buffer, ref offset, Flags); - ByteWriter.WriteByte(buffer, ref offset, EaNameLength); - LittleEndianWriter.WriteUInt16(buffer, ref offset, EaValueLength); - ByteWriter.WriteAnsiString(buffer, ref offset, EaName); - ByteWriter.WriteAnsiString(buffer, ref offset, EaValue); - } - - public int Length - { - get - { - return FixedLength + EaName.Length + EaValue.Length; - } - } - } -} diff --git a/SMBLibrary/Structures/FileFullEAInformationList.cs b/SMBLibrary/Structures/FileFullEAInformationList.cs deleted file mode 100644 index b640e86..0000000 --- a/SMBLibrary/Structures/FileFullEAInformationList.cs +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 2014 Tal Aloni . All rights reserved. - * - * You can redistribute this program and/or modify it under the terms of - * the GNU Lesser Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - */ -using System; -using System.Collections.Generic; -using System.Text; - -namespace SMBLibrary -{ - /// - /// [MS-FSCC] FILE_FULL_EA_INFORMATION buffer - /// - public class FileFullEAInformationList : List - { - public FileFullEAInformationList() - { - } - - public FileFullEAInformationList(byte[] buffer, int offset) - { - FileFullEAInformation entry = new FileFullEAInformation(buffer, offset); - this.Add(entry); - while (entry.NextEntryOffset != 0) - { - entry = new FileFullEAInformation(buffer, (int)entry.NextEntryOffset); - this.Add(entry); - } - } - - public void WriteBytes(byte[] buffer, int offset) - { - // When multiple FILE_FULL_EA_INFORMATION data elements are present in the buffer, each MUST be aligned on a 4-byte boundary - for (int index = 0; index < this.Count; index++) - { - this[index].WriteBytes(buffer, offset); - offset += this[index].Length; - if (index < this.Count - 1) - { - int padding = (4 - (offset % 4)) % 4; - offset += padding; - } - } - } - - public int Length - { - get - { - // When multiple FILE_FULL_EA_INFORMATION data elements are present in the buffer, each MUST be aligned on a 4-byte boundary - int length = 0; - for(int index = 0; index < this.Count; index++) - { - length += this[index].Length; - if (index < this.Count - 1) - { - int padding = (4 - (length % 4)) % 4; - length += padding; - } - } - return length; - } - } - } -} diff --git a/SMBLibrary/Structures/FileInformation/Set/FileFullEAInformation.cs b/SMBLibrary/Structures/FileInformation/Set/FileFullEAInformation.cs new file mode 100644 index 0000000..655f049 --- /dev/null +++ b/SMBLibrary/Structures/FileInformation/Set/FileFullEAInformation.cs @@ -0,0 +1,108 @@ +/* Copyright (C) 2014-2017 Tal Aloni . All rights reserved. + * + * You can redistribute this program and/or modify it under the terms of + * the GNU Lesser Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + */ +using System; +using System.Collections.Generic; +using System.Text; +using Utilities; + +namespace SMBLibrary +{ + /// + /// [MS-FSCC] 2.4.15 - FILE_FULL_EA_INFORMATION + /// + public class FileFullEAInformation + { + public const int FixedLength = 8; + + public uint NextEntryOffset; + public byte Flags; + private byte EaNameLength; + private ushort EaValueLength; + public string EaName; // 8-bit ASCII + public string EaValue; // 8-bit ASCII + + public FileFullEAInformation() + { + } + + public FileFullEAInformation(byte[] buffer, int offset) + { + NextEntryOffset = LittleEndianReader.ReadUInt32(buffer, ref offset); + Flags = ByteReader.ReadByte(buffer, ref offset); + EaNameLength = ByteReader.ReadByte(buffer, ref offset); + EaValueLength = LittleEndianReader.ReadUInt16(buffer, ref offset); + EaName = ByteReader.ReadAnsiString(buffer, ref offset, EaNameLength); + EaValue = ByteReader.ReadAnsiString(buffer, ref offset, EaValueLength); + } + + public void WriteBytes(byte[] buffer, int offset) + { + EaNameLength = (byte)EaName.Length; + EaValueLength = (ushort)EaValue.Length; + LittleEndianWriter.WriteUInt32(buffer, ref offset, NextEntryOffset); + ByteWriter.WriteByte(buffer, ref offset, Flags); + ByteWriter.WriteByte(buffer, ref offset, EaNameLength); + LittleEndianWriter.WriteUInt16(buffer, ref offset, EaValueLength); + ByteWriter.WriteAnsiString(buffer, ref offset, EaName); + ByteWriter.WriteAnsiString(buffer, ref offset, EaValue); + } + + public int Length + { + get + { + return FixedLength + EaName.Length + EaValue.Length; + } + } + + public static List ReadList(byte[] buffer, int offset) + { + List result = new List(); + FileFullEAInformation entry; + do + { + entry = new FileFullEAInformation(buffer, offset); + result.Add(entry); + } + while (entry.NextEntryOffset != 0); + return result; + } + + public static void WriteList(byte[] buffer, int offset, List list) + { + // When multiple FILE_FULL_EA_INFORMATION data elements are present in the buffer, each MUST be aligned on a 4-byte boundary + for (int index = 0; index < list.Count; index++) + { + FileFullEAInformation entry = list[index]; + entry.WriteBytes(buffer, offset); + int entryLength = entry.Length; + offset += entryLength; + if (index < list.Count - 1) + { + int padding = (4 - (entryLength % 4)) % 4; + offset += padding; + } + } + } + + public int GetListLength(List list) + { + // When multiple FILE_FULL_EA_INFORMATION data elements are present in the buffer, each MUST be aligned on a 4-byte boundary + int length = 0; + for (int index = 0; index < list.Count; index++) + { + length += list[index].Length; + if (index < list.Count - 1) + { + int padding = (4 - (length % 4)) % 4; + length += padding; + } + } + return length; + } + } +}