QueryFileAllInfo.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
  2. *
  3. * You can redistribute this program and/or modify it under the terms of
  4. * the GNU Lesser Public License as published by the Free Software Foundation,
  5. * either version 3 of the License, or (at your option) any later version.
  6. */
  7. using System;
  8. using System.Collections.Generic;
  9. using Utilities;
  10. namespace SMBLibrary.SMB1
  11. {
  12. /// <summary>
  13. /// SMB_QUERY_FILE_ALL_INFO
  14. /// </summary>
  15. public class QueryFileAllInfo : QueryInformation
  16. {
  17. public const int FixedLength = 72;
  18. public DateTime? CreationTime;
  19. public DateTime? LastAccessTime;
  20. public DateTime? LastWriteTime;
  21. public DateTime? LastChangeTime;
  22. public ExtendedFileAttributes ExtFileAttributes;
  23. public uint Reserved1;
  24. public long AllocationSize;
  25. public long EndOfFile;
  26. public uint NumberOfLinks;
  27. public bool DeletePending;
  28. public bool Directory;
  29. public ushort Reserved2;
  30. public uint EaSize;
  31. // uint FileNameLength; // In bytes
  32. public string FileName; // Unicode
  33. public QueryFileAllInfo()
  34. {
  35. }
  36. public QueryFileAllInfo(byte[] buffer, int offset)
  37. {
  38. CreationTime = FileTimeHelper.ReadNullableFileTime(buffer, ref offset);
  39. LastAccessTime = FileTimeHelper.ReadNullableFileTime(buffer, ref offset);
  40. LastWriteTime = FileTimeHelper.ReadNullableFileTime(buffer, ref offset);
  41. LastChangeTime = FileTimeHelper.ReadNullableFileTime(buffer, ref offset);
  42. ExtFileAttributes = (ExtendedFileAttributes)LittleEndianReader.ReadUInt32(buffer, ref offset);
  43. Reserved1 = LittleEndianReader.ReadUInt32(buffer, ref offset);
  44. AllocationSize = LittleEndianReader.ReadInt64(buffer, ref offset);
  45. EndOfFile = LittleEndianReader.ReadInt64(buffer, ref offset);
  46. NumberOfLinks = LittleEndianReader.ReadUInt32(buffer, ref offset);
  47. DeletePending = (ByteReader.ReadByte(buffer, ref offset) > 0);
  48. Directory = (ByteReader.ReadByte(buffer, ref offset) > 0);
  49. Reserved2 = LittleEndianReader.ReadUInt16(buffer, ref offset);
  50. EaSize = LittleEndianReader.ReadUInt32(buffer, ref offset);
  51. uint fileNameLength = LittleEndianReader.ReadUInt32(buffer, ref offset);
  52. FileName = ByteReader.ReadUTF16String(buffer, ref offset, (int)(fileNameLength / 2));
  53. }
  54. public override byte[] GetBytes()
  55. {
  56. uint fileNameLength = (uint)(FileName.Length * 2);
  57. byte[] buffer = new byte[FixedLength + fileNameLength];
  58. int offset = 0;
  59. FileTimeHelper.WriteFileTime(buffer, ref offset, CreationTime);
  60. FileTimeHelper.WriteFileTime(buffer, ref offset, LastAccessTime);
  61. FileTimeHelper.WriteFileTime(buffer, ref offset, LastWriteTime);
  62. FileTimeHelper.WriteFileTime(buffer, ref offset, LastChangeTime);
  63. LittleEndianWriter.WriteUInt32(buffer, ref offset, (uint)ExtFileAttributes);
  64. LittleEndianWriter.WriteUInt32(buffer, ref offset, Reserved1);
  65. LittleEndianWriter.WriteInt64(buffer, ref offset, AllocationSize);
  66. LittleEndianWriter.WriteInt64(buffer, ref offset, EndOfFile);
  67. LittleEndianWriter.WriteUInt32(buffer, ref offset, NumberOfLinks);
  68. ByteWriter.WriteByte(buffer, ref offset, Convert.ToByte(DeletePending));
  69. ByteWriter.WriteByte(buffer, ref offset, Convert.ToByte(Directory));
  70. LittleEndianWriter.WriteUInt16(buffer, ref offset, Reserved2);
  71. LittleEndianWriter.WriteUInt32(buffer, ref offset, EaSize);
  72. LittleEndianWriter.WriteUInt32(buffer, ref offset, fileNameLength);
  73. ByteWriter.WriteUTF16String(buffer, ref offset, FileName);
  74. return buffer;
  75. }
  76. public override QueryInformationLevel InformationLevel
  77. {
  78. get
  79. {
  80. return QueryInformationLevel.SMB_QUERY_FILE_ALL_INFO;
  81. }
  82. }
  83. }
  84. }