NTFileSystemHelper.Query.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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.IO;
  10. using Utilities;
  11. namespace SMBLibrary.Server
  12. {
  13. public partial class NTFileSystemHelper
  14. {
  15. public static NTStatus GetNamedPipeInformation(out FileInformation result, FileInformationClass informationClass)
  16. {
  17. switch (informationClass)
  18. {
  19. case FileInformationClass.FileBasicInformation:
  20. {
  21. FileBasicInformation information = new FileBasicInformation();
  22. information.FileAttributes = FileAttributes.Temporary;
  23. result = information;
  24. return NTStatus.STATUS_SUCCESS;
  25. }
  26. case FileInformationClass.FileStandardInformation:
  27. {
  28. FileStandardInformation information = new FileStandardInformation();
  29. information.DeletePending = true;
  30. result = information;
  31. return NTStatus.STATUS_SUCCESS;
  32. }
  33. default:
  34. result = null;
  35. return NTStatus.STATUS_INVALID_INFO_CLASS;
  36. }
  37. }
  38. public static NTStatus GetFileInformation(out FileInformation result, FileSystemEntry entry, bool deletePending, FileInformationClass informationClass)
  39. {
  40. switch (informationClass)
  41. {
  42. case FileInformationClass.FileBasicInformation:
  43. {
  44. FileBasicInformation information = new FileBasicInformation();
  45. information.CreationTime = entry.CreationTime;
  46. information.LastAccessTime = entry.LastAccessTime;
  47. information.LastWriteTime = entry.LastWriteTime;
  48. information.ChangeTime = entry.LastWriteTime;
  49. information.FileAttributes = GetFileAttributes(entry);
  50. result = information;
  51. return NTStatus.STATUS_SUCCESS;
  52. }
  53. case FileInformationClass.FileStandardInformation:
  54. {
  55. FileStandardInformation information = new FileStandardInformation();
  56. information.AllocationSize = NTFileSystemHelper.GetAllocationSize(entry.Size);
  57. information.EndOfFile = entry.Size;
  58. information.Directory = entry.IsDirectory;
  59. information.DeletePending = deletePending;
  60. result = information;
  61. return NTStatus.STATUS_SUCCESS;
  62. }
  63. case FileInformationClass.FileInternalInformation:
  64. {
  65. FileInternalInformation information = new FileInternalInformation();
  66. result = information;
  67. return NTStatus.STATUS_SUCCESS;
  68. }
  69. case FileInformationClass.FileEaInformation:
  70. {
  71. FileEaInformation information = new FileEaInformation();
  72. information.EaSize = 0;
  73. result = information;
  74. return NTStatus.STATUS_SUCCESS;
  75. }
  76. case FileInformationClass.FilePositionInformation:
  77. {
  78. result = null;
  79. return NTStatus.STATUS_NOT_IMPLEMENTED;
  80. }
  81. case FileInformationClass.FileFullEaInformation:
  82. {
  83. result = null;
  84. return NTStatus.STATUS_NOT_IMPLEMENTED;
  85. }
  86. case FileInformationClass.FileModeInformation:
  87. {
  88. result = null;
  89. return NTStatus.STATUS_NOT_IMPLEMENTED;
  90. }
  91. case FileInformationClass.FileAlignmentInformation:
  92. {
  93. result = null;
  94. return NTStatus.STATUS_NOT_IMPLEMENTED;
  95. }
  96. case FileInformationClass.FileAllInformation:
  97. {
  98. result = null;
  99. return NTStatus.STATUS_NOT_IMPLEMENTED;
  100. }
  101. case FileInformationClass.FileAlternateNameInformation:
  102. {
  103. result = null;
  104. return NTStatus.STATUS_NOT_IMPLEMENTED;
  105. }
  106. case FileInformationClass.FileStreamInformation:
  107. {
  108. // This information class is used to enumerate the data streams of a file or a directory.
  109. // A buffer of FileStreamInformation data elements is returned by the server.
  110. FileStreamInformation information = new FileStreamInformation();
  111. information.StreamSize = entry.Size;
  112. information.StreamAllocationSize = NTFileSystemHelper.GetAllocationSize(entry.Size);
  113. information.StreamName = "::$DATA";
  114. result = information;
  115. return NTStatus.STATUS_SUCCESS;
  116. }
  117. case FileInformationClass.FilePipeInformation:
  118. {
  119. result = null;
  120. return NTStatus.STATUS_NOT_IMPLEMENTED;
  121. }
  122. case FileInformationClass.FilePipeLocalInformation:
  123. {
  124. result = null;
  125. return NTStatus.STATUS_NOT_IMPLEMENTED;
  126. }
  127. case FileInformationClass.FilePipeRemoteInformation:
  128. {
  129. result = null;
  130. return NTStatus.STATUS_NOT_IMPLEMENTED;
  131. }
  132. case FileInformationClass.FileCompressionInformation:
  133. {
  134. result = null;
  135. return NTStatus.STATUS_NOT_IMPLEMENTED;
  136. }
  137. case FileInformationClass.FileNetworkOpenInformation:
  138. {
  139. FileNetworkOpenInformation information = new FileNetworkOpenInformation();
  140. information.CreationTime = entry.CreationTime;
  141. information.LastAccessTime = entry.LastAccessTime;
  142. information.LastWriteTime = entry.LastWriteTime;
  143. information.ChangeTime = entry.LastWriteTime;
  144. information.AllocationSize = NTFileSystemHelper.GetAllocationSize(entry.Size);
  145. information.EndOfFile = entry.Size;
  146. information.FileAttributes = GetFileAttributes(entry);
  147. result = information;
  148. return NTStatus.STATUS_SUCCESS;
  149. }
  150. case FileInformationClass.FileAttributeTagInformation:
  151. {
  152. result = null;
  153. return NTStatus.STATUS_NOT_IMPLEMENTED;
  154. }
  155. default:
  156. result = null;
  157. return NTStatus.STATUS_INVALID_INFO_CLASS;
  158. }
  159. }
  160. public static FileAttributes GetFileAttributes(FileSystemEntry entry)
  161. {
  162. FileAttributes attributes = 0;
  163. if (entry.IsHidden)
  164. {
  165. attributes |= FileAttributes.Hidden;
  166. }
  167. if (entry.IsReadonly)
  168. {
  169. attributes |= FileAttributes.ReadOnly;
  170. }
  171. if (entry.IsArchived)
  172. {
  173. attributes |= FileAttributes.Archive;
  174. }
  175. if (entry.IsDirectory)
  176. {
  177. attributes |= FileAttributes.Directory;
  178. }
  179. if (attributes == 0)
  180. {
  181. attributes = FileAttributes.Normal;
  182. }
  183. return attributes;
  184. }
  185. }
  186. }