diff --git a/SMBLibrary/Helpers/FileTimeHelper.cs b/SMBLibrary/Helpers/FileTimeHelper.cs index dc0307a..f609d44 100644 --- a/SMBLibrary/Helpers/FileTimeHelper.cs +++ b/SMBLibrary/Helpers/FileTimeHelper.cs @@ -1,11 +1,10 @@ -/* Copyright (C) 2014-2017 Tal Aloni . All rights reserved. +/* Copyright (C) 2014-2025 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 Utilities; namespace SMBLibrary @@ -14,6 +13,21 @@ namespace SMBLibrary { public static readonly DateTime MinFileTimeValue = new DateTime(1601, 1, 1, 0, 0, 0, DateTimeKind.Utc); + private static readonly long MaxFileTimeIntegerValue = DateTime.MaxValue.ToFileTimeUtc(); + + public static DateTime ReadFileTimeSafe(byte[] buffer, int offset) + { + long span = LittleEndianConverter.ToInt64(buffer, offset); + if (span >= 0 && span <= MaxFileTimeIntegerValue) + { + return DateTime.FromFileTimeUtc(span); + } + else + { + return DateTime.MaxValue; + } + } + public static DateTime ReadFileTime(byte[] buffer, int offset) { long span = LittleEndianConverter.ToInt64(buffer, offset); diff --git a/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileBothDirectoryInformation.cs b/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileBothDirectoryInformation.cs index 6012be5..51b2a66 100644 --- a/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileBothDirectoryInformation.cs +++ b/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileBothDirectoryInformation.cs @@ -1,11 +1,10 @@ -/* Copyright (C) 2017 Tal Aloni . All rights reserved. +/* Copyright (C) 2017-2025 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 Utilities; namespace SMBLibrary @@ -37,10 +36,10 @@ namespace SMBLibrary public FileBothDirectoryInformation(byte[] buffer, int offset) : base(buffer, offset) { - CreationTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 8)); - LastAccessTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 16)); - LastWriteTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 24)); - ChangeTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 32)); + CreationTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 8); + LastAccessTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 16); + LastWriteTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 24); + ChangeTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 32); EndOfFile = LittleEndianConverter.ToInt64(buffer, offset + 40); AllocationSize = LittleEndianConverter.ToInt64(buffer, offset + 48); FileAttributes = (FileAttributes)LittleEndianConverter.ToUInt32(buffer, offset + 56); diff --git a/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileDirectoryInformation.cs b/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileDirectoryInformation.cs index e5acaf8..8bb1844 100644 --- a/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileDirectoryInformation.cs +++ b/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileDirectoryInformation.cs @@ -1,11 +1,10 @@ -/* Copyright (C) 2017 Tal Aloni . All rights reserved. +/* Copyright (C) 2017-2025 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 Utilities; namespace SMBLibrary @@ -33,10 +32,10 @@ namespace SMBLibrary public FileDirectoryInformation(byte[] buffer, int offset) : base(buffer, offset) { - CreationTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 8)); - LastAccessTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 16)); - LastWriteTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 24)); - ChangeTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 32)); + CreationTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 8); + LastAccessTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 16); + LastWriteTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 24); + ChangeTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 32); EndOfFile = LittleEndianConverter.ToInt64(buffer, offset + 40); AllocationSize = LittleEndianConverter.ToInt64(buffer, offset + 48); FileAttributes = (FileAttributes)LittleEndianConverter.ToUInt32(buffer, offset + 56); diff --git a/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileFullDirectoryInformation.cs b/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileFullDirectoryInformation.cs index d8b01c9..602f06b 100644 --- a/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileFullDirectoryInformation.cs +++ b/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileFullDirectoryInformation.cs @@ -1,11 +1,10 @@ -/* Copyright (C) 2017 Tal Aloni . All rights reserved. +/* Copyright (C) 2017-2025 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 Utilities; namespace SMBLibrary @@ -34,10 +33,10 @@ namespace SMBLibrary public FileFullDirectoryInformation(byte[] buffer, int offset) : base(buffer, offset) { - CreationTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 8)); - LastAccessTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 16)); - LastWriteTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 24)); - ChangeTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 32)); + CreationTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 8); + LastAccessTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 16); + LastWriteTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 24); + ChangeTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 32); EndOfFile = LittleEndianConverter.ToInt64(buffer, offset + 40); AllocationSize = LittleEndianConverter.ToInt64(buffer, offset + 48); FileAttributes = (FileAttributes)LittleEndianConverter.ToUInt32(buffer, offset + 56); diff --git a/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileIdBothDirectoryInformation.cs b/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileIdBothDirectoryInformation.cs index 9dbc1ef..cee51ea 100644 --- a/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileIdBothDirectoryInformation.cs +++ b/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileIdBothDirectoryInformation.cs @@ -1,11 +1,10 @@ -/* Copyright (C) 2017 Tal Aloni . All rights reserved. +/* Copyright (C) 2017-2025 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 Utilities; namespace SMBLibrary @@ -39,10 +38,10 @@ namespace SMBLibrary public FileIdBothDirectoryInformation(byte[] buffer, int offset) : base(buffer, offset) { - CreationTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 8)); - LastAccessTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 16)); - LastWriteTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 24)); - ChangeTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 32)); + CreationTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 8); + LastAccessTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 16); + LastWriteTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 24); + ChangeTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 32); EndOfFile = LittleEndianConverter.ToInt64(buffer, offset + 40); AllocationSize = LittleEndianConverter.ToInt64(buffer, offset + 48); FileAttributes = (FileAttributes)LittleEndianConverter.ToUInt32(buffer, offset + 56); diff --git a/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileIdFullDirectoryInformation.cs b/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileIdFullDirectoryInformation.cs index 6edb7f8..b09e22e 100644 --- a/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileIdFullDirectoryInformation.cs +++ b/SMBLibrary/NTFileStore/Structures/FileInformation/QueryDirectory/FileIdFullDirectoryInformation.cs @@ -1,11 +1,10 @@ -/* Copyright (C) 2017 Tal Aloni . All rights reserved. +/* Copyright (C) 2017-2025 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 Utilities; namespace SMBLibrary @@ -36,10 +35,10 @@ namespace SMBLibrary public FileIdFullDirectoryInformation(byte[] buffer, int offset) : base(buffer, offset) { - CreationTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 8)); - LastAccessTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 16)); - LastWriteTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 24)); - ChangeTime = DateTime.FromFileTimeUtc(LittleEndianConverter.ToInt64(buffer, offset + 32)); + CreationTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 8); + LastAccessTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 16); + LastWriteTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 24); + ChangeTime = FileTimeHelper.ReadFileTimeSafe(buffer, offset + 32); EndOfFile = LittleEndianConverter.ToInt64(buffer, offset + 40); AllocationSize = LittleEndianConverter.ToInt64(buffer, offset + 48); FileAttributes = (FileAttributes)LittleEndianConverter.ToUInt32(buffer, offset + 56);