소스 검색

Moved FILETIME helper methods from SMB1Helper to FileTimeHelper

Tal Aloni 8 년 전
부모
커밋
8e67e1fab8

+ 83 - 0
SMBLibrary/Helpers/FileTimeHelper.cs

@@ -0,0 +1,83 @@
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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
+{
+    public class FileTimeHelper
+    {
+        public static readonly DateTime MinFileTimeValue = new DateTime(1601, 1, 1);
+
+        public static DateTime ReadFileTime(byte[] buffer, int offset)
+        {
+            long span = LittleEndianConverter.ToInt64(buffer, offset);
+            if (span >= 0)
+            {
+                return DateTime.FromFileTimeUtc(span);
+            }
+            else
+            {
+                throw new System.IO.InvalidDataException("FILETIME cannot be negative");
+            }
+        }
+
+        public static DateTime ReadFileTime(byte[] buffer, ref int offset)
+        {
+            offset += 8;
+            return ReadFileTime(buffer, offset - 8);
+        }
+
+        public static void WriteFileTime(byte[] buffer, int offset, DateTime time)
+        {
+            long span = time.ToFileTimeUtc();
+            LittleEndianWriter.WriteInt64(buffer, offset, span);
+        }
+
+        public static void WriteFileTime(byte[] buffer, ref int offset, DateTime time)
+        {
+            WriteFileTime(buffer, offset, time);
+            offset += 8;
+        }
+
+        public static DateTime? ReadNullableFileTime(byte[] buffer, int offset)
+        {
+            long span = LittleEndianConverter.ToInt64(buffer, offset);
+            if (span > 0)
+            {
+                return DateTime.FromFileTimeUtc(span);
+            }
+            else
+            {
+                return null;
+            }
+        }
+
+        public static DateTime? ReadNullableFileTime(byte[] buffer, ref int offset)
+        {
+            offset += 8;
+            return ReadNullableFileTime(buffer, offset - 8);
+        }
+
+        public static void WriteFileTime(byte[] buffer, int offset, DateTime? time)
+        {
+            long span = 0;
+            if (time.HasValue)
+            {
+                span = time.Value.ToFileTimeUtc();
+            }
+            LittleEndianWriter.WriteInt64(buffer, offset, span);
+        }
+
+        public static void WriteFileTime(byte[] buffer, ref int offset, DateTime? time)
+        {
+            WriteFileTime(buffer, offset, time);
+            offset += 8;
+        }
+    }
+}

+ 13 - 17
SMBLibrary/SMB1/Commands/NTCreateAndXResponse.cs

@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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,
@@ -24,10 +24,10 @@ namespace SMBLibrary.SMB1
         public OpLockLevel OpLockLevel;
         public ushort FID;
         public CreateDisposition CreateDisposition;
-        public DateTime CreateTime;
-        public DateTime LastAccessTime;
-        public DateTime LastWriteTime;
-        public DateTime LastChangeTime;
+        public DateTime? CreateTime;
+        public DateTime? LastAccessTime;
+        public DateTime? LastWriteTime;
+        public DateTime? LastChangeTime;
         public ExtendedFileAttributes ExtFileAttributes;
         public ulong AllocationSize;
         public ulong EndOfFile;
@@ -37,10 +37,6 @@ namespace SMBLibrary.SMB1
 
         public NTCreateAndXResponse() : base()
         {
-            CreateTime = SMB1Helper.FileTimeNotSpecified;
-            LastAccessTime = SMB1Helper.FileTimeNotSpecified;
-            LastWriteTime = SMB1Helper.FileTimeNotSpecified;
-            LastChangeTime = SMB1Helper.FileTimeNotSpecified;
         }
 
         public NTCreateAndXResponse(byte[] buffer, int offset) : base(buffer, offset, false)
@@ -49,10 +45,10 @@ namespace SMBLibrary.SMB1
             OpLockLevel = (OpLockLevel)ByteReader.ReadByte(this.SMBParameters, ref parametersOffset);
             FID = LittleEndianReader.ReadUInt16(this.SMBParameters, ref parametersOffset);
             CreateDisposition = (CreateDisposition)LittleEndianReader.ReadUInt32(this.SMBParameters, ref parametersOffset);
-            CreateTime = SMB1Helper.ReadFileTime(buffer, ref parametersOffset);
-            LastAccessTime = SMB1Helper.ReadFileTime(buffer, ref parametersOffset);
-            LastWriteTime = SMB1Helper.ReadFileTime(buffer, ref parametersOffset);
-            LastChangeTime = SMB1Helper.ReadFileTime(buffer, ref parametersOffset);
+            CreateTime = FileTimeHelper.ReadNullableFileTime(buffer, ref parametersOffset);
+            LastAccessTime = FileTimeHelper.ReadNullableFileTime(buffer, ref parametersOffset);
+            LastWriteTime = FileTimeHelper.ReadNullableFileTime(buffer, ref parametersOffset);
+            LastChangeTime = FileTimeHelper.ReadNullableFileTime(buffer, ref parametersOffset);
             ExtFileAttributes = (ExtendedFileAttributes)LittleEndianReader.ReadUInt32(this.SMBParameters, ref parametersOffset);
             AllocationSize = LittleEndianReader.ReadUInt64(buffer, ref parametersOffset);
             EndOfFile = LittleEndianReader.ReadUInt64(buffer, ref parametersOffset);
@@ -68,10 +64,10 @@ namespace SMBLibrary.SMB1
             ByteWriter.WriteByte(this.SMBParameters, ref parametersOffset, (byte)OpLockLevel);
             LittleEndianWriter.WriteUInt16(this.SMBParameters, ref parametersOffset, FID);
             LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, (uint)CreateDisposition);
-            SMB1Helper.WriteFileTime(this.SMBParameters, ref parametersOffset, CreateTime);
-            SMB1Helper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastAccessTime);
-            SMB1Helper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastWriteTime);
-            SMB1Helper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastChangeTime);
+            FileTimeHelper.WriteFileTime(this.SMBParameters, ref parametersOffset, CreateTime);
+            FileTimeHelper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastAccessTime);
+            FileTimeHelper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastWriteTime);
+            FileTimeHelper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastChangeTime);
             LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, (uint)ExtFileAttributes);
             LittleEndianWriter.WriteUInt64(this.SMBParameters, ref parametersOffset, AllocationSize);
             LittleEndianWriter.WriteUInt64(this.SMBParameters, ref parametersOffset, EndOfFile);

+ 13 - 17
SMBLibrary/SMB1/Commands/NTCreateAndXResponseExtended.cs

@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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,
@@ -24,10 +24,10 @@ namespace SMBLibrary.SMB1
         public OpLockLevel OpLockLevel;
         public ushort FID;
         public CreateDisposition CreateDisposition;
-        public DateTime CreateTime;
-        public DateTime LastAccessTime;
-        public DateTime LastWriteTime;
-        public DateTime LastChangeTime;
+        public DateTime? CreateTime;
+        public DateTime? LastAccessTime;
+        public DateTime? LastWriteTime;
+        public DateTime? LastChangeTime;
         public ExtendedFileAttributes ExtFileAttributes;
         public ulong AllocationSize;
         public ulong EndOfFile;
@@ -41,10 +41,6 @@ namespace SMBLibrary.SMB1
         
         public NTCreateAndXResponseExtended() : base()
         {
-            CreateTime = SMB1Helper.FileTimeNotSpecified;
-            LastAccessTime = SMB1Helper.FileTimeNotSpecified;
-            LastWriteTime = SMB1Helper.FileTimeNotSpecified;
-            LastChangeTime = SMB1Helper.FileTimeNotSpecified;
         }
 
         public NTCreateAndXResponseExtended(byte[] buffer, int offset) : base(buffer, offset, false)
@@ -53,10 +49,10 @@ namespace SMBLibrary.SMB1
             OpLockLevel = (OpLockLevel)ByteReader.ReadByte(this.SMBParameters, ref parametersOffset);
             FID = LittleEndianReader.ReadUInt16(this.SMBParameters, ref parametersOffset);
             CreateDisposition = (CreateDisposition)LittleEndianReader.ReadUInt32(this.SMBParameters, ref parametersOffset);
-            CreateTime = SMB1Helper.ReadFileTime(buffer, ref parametersOffset);
-            LastAccessTime = SMB1Helper.ReadFileTime(buffer, ref parametersOffset);
-            LastWriteTime = SMB1Helper.ReadFileTime(buffer, ref parametersOffset);
-            LastChangeTime = SMB1Helper.ReadFileTime(buffer, ref parametersOffset);
+            CreateTime = FileTimeHelper.ReadNullableFileTime(buffer, ref parametersOffset);
+            LastAccessTime = FileTimeHelper.ReadNullableFileTime(buffer, ref parametersOffset);
+            LastWriteTime = FileTimeHelper.ReadNullableFileTime(buffer, ref parametersOffset);
+            LastChangeTime = FileTimeHelper.ReadNullableFileTime(buffer, ref parametersOffset);
             ExtFileAttributes = (ExtendedFileAttributes)LittleEndianReader.ReadUInt32(this.SMBParameters, ref parametersOffset);
             AllocationSize = LittleEndianReader.ReadUInt64(buffer, ref parametersOffset);
             EndOfFile = LittleEndianReader.ReadUInt64(buffer, ref parametersOffset);
@@ -76,10 +72,10 @@ namespace SMBLibrary.SMB1
             ByteWriter.WriteByte(this.SMBParameters, ref parametersOffset, (byte)OpLockLevel);
             LittleEndianWriter.WriteUInt16(this.SMBParameters, ref parametersOffset, FID);
             LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, (uint)CreateDisposition);
-            SMB1Helper.WriteFileTime(this.SMBParameters, ref parametersOffset, CreateTime);
-            SMB1Helper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastAccessTime);
-            SMB1Helper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastWriteTime);
-            SMB1Helper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastChangeTime);
+            FileTimeHelper.WriteFileTime(this.SMBParameters, ref parametersOffset, CreateTime);
+            FileTimeHelper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastAccessTime);
+            FileTimeHelper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastWriteTime);
+            FileTimeHelper.WriteFileTime(this.SMBParameters, ref parametersOffset, LastChangeTime);
             LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, (uint)ExtFileAttributes);
             LittleEndianWriter.WriteUInt64(this.SMBParameters, ref parametersOffset, AllocationSize);
             LittleEndianWriter.WriteUInt64(this.SMBParameters, ref parametersOffset, EndOfFile);

+ 1 - 27
SMBLibrary/SMB1/SMB1Helper.cs

@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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,
@@ -14,7 +14,6 @@ namespace SMBLibrary.SMB1
     public class SMB1Helper
     {
         public static readonly DateTime UTimeNotSpecified = new DateTime(1970, 1, 1);
-        public static readonly DateTime FileTimeNotSpecified = new DateTime(1601, 1, 1);
 
         public static DateTime ReadFileTime(byte[] buffer, int offset)
         {
@@ -36,31 +35,6 @@ namespace SMBLibrary.SMB1
             return ReadFileTime(buffer, offset - 8);
         }
 
-        public static DateTime ReadSetFileTime(byte[] buffer, int offset)
-        {
-            long span = LittleEndianConverter.ToInt64(buffer, offset);
-            if (span >= 0)
-            {
-                return DateTime.FromFileTimeUtc(span);
-            }
-            else
-            {
-                return FileTimeNotSpecified;
-            }
-        }
-
-        public static void WriteFileTime(byte[] buffer, int offset, DateTime time)
-        {
-            long span = time.ToFileTimeUtc();
-            LittleEndianWriter.WriteInt64(buffer, offset, span);
-        }
-
-        public static void WriteFileTime(byte[] buffer, ref int offset, DateTime time)
-        {
-            WriteFileTime(buffer, offset, time);
-            offset += 8;
-        }
-
         // UTime - The number of seconds since Jan 1, 1970, 00:00:00
         public static DateTime ReadUTime(byte[] buffer, int offset)
         {

+ 5 - 5
SMBLibrary/SMB1/Transaction2Subcommands/Structures/FindInformation/FindFileBothDirectoryInfo.cs

@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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,
@@ -69,10 +69,10 @@ namespace SMBLibrary.SMB1
 
             LittleEndianWriter.WriteUInt32(buffer, ref offset, NextEntryOffset);
             LittleEndianWriter.WriteUInt32(buffer, ref offset, FileIndex);
-            SMB1Helper.WriteFileTime(buffer, ref offset, CreationTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastAccessTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastWriteTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastChangeTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, CreationTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastAccessTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastWriteTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastChangeTime);
             LittleEndianWriter.WriteUInt64(buffer, ref offset, EndOfFile);
             LittleEndianWriter.WriteUInt64(buffer, ref offset, AllocationSize);
             LittleEndianWriter.WriteUInt32(buffer, ref offset, (uint)ExtFileAttributes);

+ 5 - 5
SMBLibrary/SMB1/Transaction2Subcommands/Structures/FindInformation/FindFileDirectoryInfo.cs

@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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,
@@ -55,10 +55,10 @@ namespace SMBLibrary.SMB1
 
             LittleEndianWriter.WriteUInt32(buffer, ref offset, NextEntryOffset);
             LittleEndianWriter.WriteUInt32(buffer, ref offset, FileIndex);
-            SMB1Helper.WriteFileTime(buffer, ref offset, CreationTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastAccessTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastWriteTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastAttrChangeTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, CreationTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastAccessTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastWriteTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastAttrChangeTime);
             LittleEndianWriter.WriteUInt64(buffer, ref offset, EndOfFile);
             LittleEndianWriter.WriteUInt64(buffer, ref offset, AllocationSize);
             LittleEndianWriter.WriteUInt32(buffer, ref offset, (uint)ExtFileAttributes);

+ 5 - 5
SMBLibrary/SMB1/Transaction2Subcommands/Structures/FindInformation/FindFileFullDirectoryInfo.cs

@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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,
@@ -57,10 +57,10 @@ namespace SMBLibrary.SMB1
 
             LittleEndianWriter.WriteUInt32(buffer, ref offset, NextEntryOffset);
             LittleEndianWriter.WriteUInt32(buffer, ref offset, FileIndex);
-            SMB1Helper.WriteFileTime(buffer, ref offset, CreationTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastAccessTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastWriteTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastAttrChangeTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, CreationTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastAccessTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastWriteTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastAttrChangeTime);
             LittleEndianWriter.WriteUInt64(buffer, ref offset, EndOfFile);
             LittleEndianWriter.WriteUInt64(buffer, ref offset, AllocationSize);
             LittleEndianWriter.WriteUInt32(buffer, ref offset, (uint)ExtFileAttributes);

+ 2 - 2
SMBLibrary/SMB1/Transaction2Subcommands/Structures/QueryFSInformation/QueryFSVolumeInfo.cs

@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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,
@@ -43,7 +43,7 @@ namespace SMBLibrary.SMB1
             uint volumeLabelSize = (uint)(VolumeLabel.Length * 2);
 
             byte[] buffer = new byte[FixedLength + volumeLabelSize];
-            SMB1Helper.WriteFileTime(buffer, 0, VolumeCreationTime);
+            FileTimeHelper.WriteFileTime(buffer, 0, VolumeCreationTime);
             LittleEndianWriter.WriteUInt32(buffer, 8, SerialNumber);
             LittleEndianWriter.WriteUInt32(buffer, 12, volumeLabelSize);
             LittleEndianWriter.WriteUInt16(buffer, 16, Reserved);

+ 5 - 5
SMBLibrary/SMB1/Transaction2Subcommands/Structures/QueryInformation/QueryFileAllInfo.cs

@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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,
@@ -62,10 +62,10 @@ namespace SMBLibrary.SMB1
             uint fileNameLength = (uint)(FileName.Length * 2);
             byte[] buffer = new byte[FixedLength + fileNameLength];
             int offset = 0;
-            SMB1Helper.WriteFileTime(buffer, ref offset, CreationDateTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastAccessDateTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastWriteDateTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastChangeTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, CreationDateTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastAccessDateTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastWriteDateTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastChangeTime);
             LittleEndianWriter.WriteUInt32(buffer, ref offset, (uint)ExtFileAttributes);
             LittleEndianWriter.WriteUInt32(buffer, ref offset, Reserved1); 
             LittleEndianWriter.WriteUInt64(buffer, ref offset, AllocationSize);

+ 5 - 5
SMBLibrary/SMB1/Transaction2Subcommands/Structures/QueryInformation/QueryFileBasicInfo.cs

@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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,
@@ -43,10 +43,10 @@ namespace SMBLibrary.SMB1
         {
             byte[] buffer = new byte[Length];
             int offset = 0;
-            SMB1Helper.WriteFileTime(buffer, ref offset, CreationDateTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastAccessDateTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastWriteDateTime);
-            SMB1Helper.WriteFileTime(buffer, ref offset, LastChangeTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, CreationDateTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastAccessDateTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastWriteDateTime);
+            FileTimeHelper.WriteFileTime(buffer, ref offset, LastChangeTime);
             LittleEndianWriter.WriteUInt32(buffer, ref offset, (uint)ExtFileAttributes);
             LittleEndianWriter.WriteUInt32(buffer, ref offset, Reserved);
             return buffer;

+ 13 - 13
SMBLibrary/SMB1/Transaction2Subcommands/Structures/SetInformation/SetFileBasicInfo.cs

@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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,
@@ -18,10 +18,10 @@ namespace SMBLibrary.SMB1
     {
         public const int Length = 40;
 
-        public DateTime CreationTime;
-        public DateTime LastAccessTime;
-        public DateTime LastWriteTime;
-        public DateTime LastChangeTime;
+        public DateTime? CreationTime;
+        public DateTime? LastAccessTime;
+        public DateTime? LastWriteTime;
+        public DateTime? LastChangeTime;
         public ExtendedFileAttributes ExtFileAttributes;
         public uint Reserved;
 
@@ -35,10 +35,10 @@ namespace SMBLibrary.SMB1
 
         public SetFileBasicInfo(byte[] buffer, int offset)
         {
-            CreationTime = SMB1Helper.ReadSetFileTime(buffer, offset + 0);
-            LastAccessTime = SMB1Helper.ReadSetFileTime(buffer, offset + 8);
-            LastWriteTime = SMB1Helper.ReadSetFileTime(buffer, offset + 16);
-            LastChangeTime = SMB1Helper.ReadSetFileTime(buffer, offset + 24);
+            CreationTime = FileTimeHelper.ReadNullableFileTime(buffer, offset + 0);
+            LastAccessTime = FileTimeHelper.ReadNullableFileTime(buffer, offset + 8);
+            LastWriteTime = FileTimeHelper.ReadNullableFileTime(buffer, offset + 16);
+            LastChangeTime = FileTimeHelper.ReadNullableFileTime(buffer, offset + 24);
             ExtFileAttributes = (ExtendedFileAttributes)LittleEndianConverter.ToUInt32(buffer, offset + 32);
             Reserved = LittleEndianConverter.ToUInt32(buffer, offset + 36);
         }
@@ -46,10 +46,10 @@ namespace SMBLibrary.SMB1
         public override byte[] GetBytes()
         {
             byte[] buffer = new byte[Length];
-            SMB1Helper.WriteFileTime(buffer, 0, CreationTime);
-            SMB1Helper.WriteFileTime(buffer, 8, LastAccessTime);
-            SMB1Helper.WriteFileTime(buffer, 16, LastWriteTime);
-            SMB1Helper.WriteFileTime(buffer, 24, LastChangeTime);
+            FileTimeHelper.WriteFileTime(buffer, 0, CreationTime);
+            FileTimeHelper.WriteFileTime(buffer, 8, LastAccessTime);
+            FileTimeHelper.WriteFileTime(buffer, 16, LastWriteTime);
+            FileTimeHelper.WriteFileTime(buffer, 24, LastChangeTime);
             LittleEndianWriter.WriteUInt32(buffer, 32, (uint)ExtFileAttributes);
             LittleEndianWriter.WriteUInt32(buffer, 36, Reserved);
             return buffer;

+ 1 - 0
SMBLibrary/SMBLibrary.csproj

@@ -56,6 +56,7 @@
     <Compile Include="Enums\SMBTransportType.cs" />
     <Compile Include="Enums\Win32Error.cs" />
     <Compile Include="EnumStructures\AccessMask.cs" />
+    <Compile Include="Helpers\FileTimeHelper.cs" />
     <Compile Include="NetBios\NameServicePackets\Enums\NameRecordType.cs" />
     <Compile Include="NetBios\NameServicePackets\Enums\NameServiceOperation.cs" />
     <Compile Include="NetBios\NameServicePackets\Enums\NetBiosSuffix.cs" />

+ 1 - 17
SMBLibrary/Server/SMB1/Transaction2SubcommandHelper.cs

@@ -323,25 +323,9 @@ namespace SMBLibrary.Server.SMB1
                         return null;
                     }
 
-                    DateTime? creationTime = null;
-                    DateTime? lastWriteDT = null;
-                    DateTime? lastAccessTime = null;
-                    if (info.CreationTime != SMB1Helper.FileTimeNotSpecified)
-                    {
-                        creationTime = info.CreationTime;
-                    }
-                    if (info.LastWriteTime != SMB1Helper.FileTimeNotSpecified)
-                    {
-                        lastWriteDT = info.LastWriteTime;
-                    }
-                    if (info.LastAccessTime != SMB1Helper.FileTimeNotSpecified)
-                    {
-                        lastAccessTime = info.LastAccessTime;
-                    }
-
                     try
                     {
-                        share.FileSystem.SetDates(openedFilePath, creationTime, lastWriteDT, lastAccessTime);
+                        share.FileSystem.SetDates(openedFilePath, info.CreationTime, info.LastWriteTime, info.LastAccessTime);
                     }
                     catch (IOException ex)
                     {