SMB1FileSystemHelper.Find.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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 System.Text;
  10. using SMBLibrary.SMB1;
  11. using Utilities;
  12. namespace SMBLibrary.Server.SMB1
  13. {
  14. public partial class SMB1FileSystemHelper
  15. {
  16. /// <exception cref="SMBLibrary.UnsupportedInformationLevelException"></exception>
  17. public static FindInformationList GetFindInformationList(List<FileSystemEntry> entries, FindInformationLevel informationLevel, bool isUnicode, bool returnResumeKeys, int maxLength)
  18. {
  19. FindInformationList result = new FindInformationList();
  20. for (int index = 0; index < entries.Count; index++)
  21. {
  22. FindInformation infoEntry = GetFindInformation(entries[index], informationLevel, isUnicode, returnResumeKeys);
  23. result.Add(infoEntry);
  24. if (result.GetLength(isUnicode) > maxLength)
  25. {
  26. result.RemoveAt(result.Count - 1);
  27. break;
  28. }
  29. }
  30. return result;
  31. }
  32. /// <exception cref="SMBLibrary.UnsupportedInformationLevelException"></exception>
  33. public static FindInformation GetFindInformation(FileSystemEntry entry, FindInformationLevel informationLevel, bool isUnicode, bool returnResumeKeys)
  34. {
  35. switch (informationLevel)
  36. {
  37. case FindInformationLevel.SMB_INFO_STANDARD:
  38. {
  39. FindInfoStandard result = new FindInfoStandard(returnResumeKeys);
  40. result.CreationDateTime = entry.CreationTime;
  41. result.LastAccessDateTime = entry.LastAccessTime;
  42. result.LastWriteDateTime = entry.LastWriteTime;
  43. result.FileDataSize = (uint)Math.Min(entry.Size, UInt32.MaxValue);
  44. result.AllocationSize = (uint)Math.Min(NTFileSystemHelper.GetAllocationSize(entry.Size), UInt32.MaxValue);
  45. result.Attributes = GetFileAttributes(entry);
  46. result.FileName = entry.Name;
  47. return result;
  48. }
  49. case FindInformationLevel.SMB_INFO_QUERY_EA_SIZE:
  50. {
  51. FindInfoQueryEASize result = new FindInfoQueryEASize(returnResumeKeys);
  52. result.CreationDateTime = entry.CreationTime;
  53. result.LastAccessDateTime = entry.LastAccessTime;
  54. result.LastWriteDateTime = entry.LastWriteTime;
  55. result.FileDataSize = (uint)Math.Min(entry.Size, UInt32.MaxValue);
  56. result.AllocationSize = (uint)Math.Min(NTFileSystemHelper.GetAllocationSize(entry.Size), UInt32.MaxValue);
  57. result.Attributes = GetFileAttributes(entry);
  58. result.EASize = 0;
  59. result.FileName = entry.Name;
  60. return result;
  61. }
  62. case FindInformationLevel.SMB_INFO_QUERY_EAS_FROM_LIST:
  63. {
  64. FindInfoQueryExtendedAttributesFromList result = new FindInfoQueryExtendedAttributesFromList(returnResumeKeys);
  65. result.CreationDateTime = entry.CreationTime;
  66. result.LastAccessDateTime = entry.LastAccessTime;
  67. result.LastWriteDateTime = entry.LastWriteTime;
  68. result.FileDataSize = (uint)Math.Min(entry.Size, UInt32.MaxValue);
  69. result.AllocationSize = (uint)Math.Min(NTFileSystemHelper.GetAllocationSize(entry.Size), UInt32.MaxValue);
  70. result.Attributes = GetFileAttributes(entry);
  71. result.ExtendedAttributeList = new FullExtendedAttributeList();
  72. return result;
  73. }
  74. case FindInformationLevel.SMB_FIND_FILE_DIRECTORY_INFO:
  75. {
  76. FindFileDirectoryInfo result = new FindFileDirectoryInfo();
  77. result.CreationTime = entry.CreationTime;
  78. result.LastAccessTime = entry.LastAccessTime;
  79. result.LastWriteTime = entry.LastWriteTime;
  80. result.LastAttrChangeTime = entry.LastWriteTime;
  81. result.EndOfFile = entry.Size;
  82. result.AllocationSize = NTFileSystemHelper.GetAllocationSize(entry.Size);
  83. result.ExtFileAttributes = GetExtendedFileAttributes(entry);
  84. result.FileName = entry.Name;
  85. return result;
  86. }
  87. case FindInformationLevel.SMB_FIND_FILE_FULL_DIRECTORY_INFO:
  88. {
  89. FindFileFullDirectoryInfo result = new FindFileFullDirectoryInfo();
  90. result.CreationTime = entry.CreationTime;
  91. result.LastAccessTime = entry.LastAccessTime;
  92. result.LastWriteTime = entry.LastWriteTime;
  93. result.LastAttrChangeTime = entry.LastWriteTime;
  94. result.EndOfFile = entry.Size;
  95. result.AllocationSize = NTFileSystemHelper.GetAllocationSize(entry.Size);
  96. result.ExtFileAttributes = GetExtendedFileAttributes(entry);
  97. result.FileName = entry.Name;
  98. return result;
  99. }
  100. case FindInformationLevel.SMB_FIND_FILE_NAMES_INFO:
  101. {
  102. FindFileNamesInfo result = new FindFileNamesInfo();
  103. result.FileName = entry.Name;
  104. return result;
  105. }
  106. case FindInformationLevel.SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
  107. {
  108. FindFileBothDirectoryInfo result = new FindFileBothDirectoryInfo();
  109. result.CreationTime = entry.CreationTime;
  110. result.LastAccessTime = entry.LastAccessTime;
  111. result.LastWriteTime = entry.LastWriteTime;
  112. result.LastChangeTime = entry.LastWriteTime;
  113. result.EndOfFile = entry.Size;
  114. result.AllocationSize = NTFileSystemHelper.GetAllocationSize(entry.Size);
  115. result.ExtFileAttributes = GetExtendedFileAttributes(entry);
  116. result.ShortName = NTFileSystemHelper.GetShortName(entry.Name);
  117. result.FileName = entry.Name;
  118. return result;
  119. }
  120. default:
  121. {
  122. throw new UnsupportedInformationLevelException();
  123. }
  124. }
  125. }
  126. }
  127. }