From 09419f145fca1e7352444b67c88b77aa784d1815 Mon Sep 17 00:00:00 2001 From: Tal Aloni Date: Wed, 26 Jul 2017 12:34:34 +0300 Subject: [PATCH] NTFileStore: Added FileLinkInformationType1 and FileRenameInformationType1 implementations --- .../Set/FileLinkInformationType1.cs | 69 +++++++++++++++++++ .../Set/FileLinkInformationType2.cs | 5 ++ .../Set/FileRenameInformationType1.cs | 69 +++++++++++++++++++ .../Set/FileRenameInformationType2.cs | 5 ++ SMBLibrary/SMBLibrary.csproj | 2 + 5 files changed, 150 insertions(+) create mode 100644 SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileLinkInformationType1.cs create mode 100644 SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileRenameInformationType1.cs diff --git a/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileLinkInformationType1.cs b/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileLinkInformationType1.cs new file mode 100644 index 0000000..163a23c --- /dev/null +++ b/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileLinkInformationType1.cs @@ -0,0 +1,69 @@ +/* Copyright (C) 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.21.1 - FileLinkInformation Type 1 + /// + /// + /// [MS-FSA] 2.1.5.14.6 + /// FILE_LINK_INFORMATION_TYPE_1: Used for 32-bit local clients. + /// FILE_LINK_INFORMATION_TYPE_2: Used for remote clients or 64-bit local clients. + /// + public class FileLinkInformationType1 : FileInformation + { + public const int FixedLength = 12; + + public bool ReplaceIfExists; + // 3 reserved bytes + public uint RootDirectory; + private uint FileNameLength; + public string FileName = String.Empty; + + public FileLinkInformationType1() + { + } + + public FileLinkInformationType1(byte[] buffer, int offset) + { + ReplaceIfExists = Conversion.ToBoolean(ByteReader.ReadByte(buffer, offset + 0)); + RootDirectory = LittleEndianConverter.ToUInt32(buffer, offset + 4); + FileNameLength = LittleEndianConverter.ToUInt32(buffer, offset + 8); + FileName = ByteReader.ReadUTF16String(buffer, offset + 12, (int)FileNameLength / 2); + } + + public override void WriteBytes(byte[] buffer, int offset) + { + FileNameLength = (uint)(FileName.Length * 2); + ByteWriter.WriteByte(buffer, offset + 0, Convert.ToByte(ReplaceIfExists)); + LittleEndianWriter.WriteUInt32(buffer, offset + 4, RootDirectory); + LittleEndianWriter.WriteUInt32(buffer, offset + 8, FileNameLength); + ByteWriter.WriteUTF16String(buffer, offset + 12, FileName); + } + + public override FileInformationClass FileInformationClass + { + get + { + return FileInformationClass.FileLinkInformation; + } + } + + public override int Length + { + get + { + return FixedLength + FileName.Length * 2; + } + } + } +} diff --git a/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileLinkInformationType2.cs b/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileLinkInformationType2.cs index d1224db..366b56f 100644 --- a/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileLinkInformationType2.cs +++ b/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileLinkInformationType2.cs @@ -14,6 +14,11 @@ namespace SMBLibrary /// /// [MS-FSCC] 2.4.21.2 - FileLinkInformation Type 2 /// + /// + /// [MS-FSA] 2.1.5.14.6 + /// FILE_LINK_INFORMATION_TYPE_1: Used for 32-bit local clients. + /// FILE_LINK_INFORMATION_TYPE_2: Used for remote clients or 64-bit local clients. + /// public class FileLinkInformationType2 : FileInformation { public const int FixedLength = 20; diff --git a/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileRenameInformationType1.cs b/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileRenameInformationType1.cs new file mode 100644 index 0000000..29f6fa6 --- /dev/null +++ b/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileRenameInformationType1.cs @@ -0,0 +1,69 @@ +/* Copyright (C) 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.34.1 - FileRenameInformation Type 1 + /// + /// + /// [MS-FSA] 2.1.5.14.11 + /// FILE_RENAME_INFORMATION_TYPE_1: Used for 32-bit local clients. + /// FILE_RENAME_INFORMATION_TYPE_2: Used for remote clients or 64-bit local clients. + /// + public class FileRenameInformationType1 : FileInformation + { + public const int FixedLength = 12; + + public bool ReplaceIfExists; + // 3 reserved bytes + public uint RootDirectory; + private uint FileNameLength; + public string FileName = String.Empty; + + public FileRenameInformationType1() + { + } + + public FileRenameInformationType1(byte[] buffer, int offset) + { + ReplaceIfExists = Conversion.ToBoolean(ByteReader.ReadByte(buffer, offset + 0)); + RootDirectory = LittleEndianConverter.ToUInt32(buffer, offset + 4); + FileNameLength = LittleEndianConverter.ToUInt32(buffer, offset + 8); + FileName = ByteReader.ReadUTF16String(buffer, offset + 12, (int)FileNameLength / 2); + } + + public override void WriteBytes(byte[] buffer, int offset) + { + FileNameLength = (uint)(FileName.Length * 2); + ByteWriter.WriteByte(buffer, offset + 0, Convert.ToByte(ReplaceIfExists)); + LittleEndianWriter.WriteUInt32(buffer, offset + 4, RootDirectory); + LittleEndianWriter.WriteUInt32(buffer, offset + 8, FileNameLength); + ByteWriter.WriteUTF16String(buffer, offset + 12, FileName); + } + + public override FileInformationClass FileInformationClass + { + get + { + return FileInformationClass.FileRenameInformation; + } + } + + public override int Length + { + get + { + return FixedLength + FileName.Length * 2; + } + } + } +} diff --git a/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileRenameInformationType2.cs b/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileRenameInformationType2.cs index 88d270d..274d25b 100644 --- a/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileRenameInformationType2.cs +++ b/SMBLibrary/NTFileStore/Structures/FileInformation/Set/FileRenameInformationType2.cs @@ -14,6 +14,11 @@ namespace SMBLibrary /// /// [MS-FSCC] 2.4.34.2 - FileRenameInformation Type 2 /// + /// + /// [MS-FSA] 2.1.5.14.11 + /// FILE_RENAME_INFORMATION_TYPE_1: Used for 32-bit local clients. + /// FILE_RENAME_INFORMATION_TYPE_2: Used for remote clients or 64-bit local clients. + /// public class FileRenameInformationType2 : FileInformation { public const int FixedLength = 20; diff --git a/SMBLibrary/SMBLibrary.csproj b/SMBLibrary/SMBLibrary.csproj index 9fbf9cd..61f62c9 100644 --- a/SMBLibrary/SMBLibrary.csproj +++ b/SMBLibrary/SMBLibrary.csproj @@ -142,7 +142,9 @@ + +