SMB1FileStoreHelper.Query.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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 SMB1FileStoreHelper
  15. {
  16. public static NTStatus GetFileInformation(out QueryInformation result, INTFileStore fileStore, string path, QueryInformationLevel informationLevel, SecurityContext securityContext)
  17. {
  18. object handle;
  19. FileStatus fileStatus;
  20. NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_READ_ATTRIBUTES, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext);
  21. if (openStatus != NTStatus.STATUS_SUCCESS)
  22. {
  23. result = null;
  24. return openStatus;
  25. }
  26. NTStatus returnStatus = GetFileInformation(out result, fileStore, handle, informationLevel);
  27. fileStore.CloseFile(handle);
  28. return returnStatus;
  29. }
  30. public static NTStatus GetFileInformation(out QueryInformation result, INTFileStore fileStore, object handle, QueryInformationLevel informationLevel)
  31. {
  32. result = null;
  33. FileInformation fileInfo;
  34. switch (informationLevel)
  35. {
  36. case QueryInformationLevel.SMB_INFO_QUERY_ALL_EAS:
  37. {
  38. result = null;
  39. return NTStatus.STATUS_NOT_IMPLEMENTED;
  40. }
  41. case QueryInformationLevel.SMB_INFO_IS_NAME_VALID:
  42. {
  43. result = null;
  44. return NTStatus.STATUS_NOT_IMPLEMENTED;
  45. }
  46. case QueryInformationLevel.SMB_QUERY_FILE_BASIC_INFO:
  47. {
  48. NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileBasicInformation);
  49. if (status != NTStatus.STATUS_SUCCESS)
  50. {
  51. return status;
  52. }
  53. FileBasicInformation fileBasicInfo = (FileBasicInformation)fileInfo;
  54. QueryFileBasicInfo information = new QueryFileBasicInfo();
  55. information.CreationTime = fileBasicInfo.CreationTime;
  56. information.LastAccessTime = fileBasicInfo.LastAccessTime;
  57. information.LastWriteTime = fileBasicInfo.LastWriteTime;
  58. information.LastChangeTime = fileBasicInfo.LastWriteTime;
  59. information.ExtFileAttributes = (ExtendedFileAttributes)fileBasicInfo.FileAttributes;
  60. result = information;
  61. return NTStatus.STATUS_SUCCESS;
  62. }
  63. case QueryInformationLevel.SMB_QUERY_FILE_STANDARD_INFO:
  64. {
  65. NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileStandardInformation);
  66. if (status != NTStatus.STATUS_SUCCESS)
  67. {
  68. return status;
  69. }
  70. FileStandardInformation fileStandardInfo = (FileStandardInformation)fileInfo;
  71. QueryFileStandardInfo information = new QueryFileStandardInfo();
  72. information.AllocationSize = fileStandardInfo.AllocationSize;
  73. information.EndOfFile = fileStandardInfo.EndOfFile;
  74. information.DeletePending = fileStandardInfo.DeletePending;
  75. information.Directory = fileStandardInfo.Directory;
  76. result = information;
  77. return NTStatus.STATUS_SUCCESS;
  78. }
  79. case QueryInformationLevel.SMB_QUERY_FILE_EA_INFO:
  80. {
  81. NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileEaInformation);
  82. if (status != NTStatus.STATUS_SUCCESS)
  83. {
  84. return status;
  85. }
  86. FileEaInformation fileEAInfo = (FileEaInformation)fileInfo;
  87. QueryFileExtendedAttributeInfo information = new QueryFileExtendedAttributeInfo();
  88. information.EASize = fileEAInfo.EaSize;
  89. result = information;
  90. return NTStatus.STATUS_SUCCESS;
  91. }
  92. case QueryInformationLevel.SMB_QUERY_FILE_NAME_INFO:
  93. {
  94. NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileNameInformation);
  95. if (status != NTStatus.STATUS_SUCCESS)
  96. {
  97. return status;
  98. }
  99. FileNameInformation fileNameInfo = (FileNameInformation)fileInfo;
  100. QueryFileNameInfo information = new QueryFileNameInfo();
  101. information.FileName = fileNameInfo.FileName;
  102. result = information;
  103. return NTStatus.STATUS_SUCCESS;
  104. }
  105. case QueryInformationLevel.SMB_QUERY_FILE_ALL_INFO:
  106. {
  107. NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileAllInformation);
  108. if (status != NTStatus.STATUS_SUCCESS)
  109. {
  110. return status;
  111. }
  112. FileAllInformation fileAllInfo = (FileAllInformation)fileInfo;
  113. QueryFileAllInfo information = new QueryFileAllInfo();
  114. information.CreationDateTime = fileAllInfo.BasicInformation.CreationTime;
  115. information.LastAccessDateTime = fileAllInfo.BasicInformation.LastAccessTime;
  116. information.LastWriteDateTime = fileAllInfo.BasicInformation.LastWriteTime;
  117. information.LastChangeTime = fileAllInfo.BasicInformation.LastWriteTime;
  118. information.ExtFileAttributes = (ExtendedFileAttributes)fileAllInfo.BasicInformation.FileAttributes;
  119. information.AllocationSize = fileAllInfo.StandardInformation.AllocationSize;
  120. information.EndOfFile = fileAllInfo.StandardInformation.EndOfFile;
  121. information.DeletePending = fileAllInfo.StandardInformation.DeletePending;
  122. information.Directory = fileAllInfo.StandardInformation.Directory;
  123. information.EASize = fileAllInfo.EaInformation.EaSize;
  124. information.FileName = fileAllInfo.NameInformation.FileName;
  125. result = information;
  126. return NTStatus.STATUS_SUCCESS;
  127. }
  128. case QueryInformationLevel.SMB_QUERY_FILE_ALT_NAME_INFO:
  129. {
  130. NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileAlternateNameInformation);
  131. if (status != NTStatus.STATUS_SUCCESS)
  132. {
  133. return status;
  134. }
  135. FileAlternateNameInformation fileAltNameInfo = (FileAlternateNameInformation)fileInfo;
  136. QueryFileAltNameInfo information = new QueryFileAltNameInfo();
  137. information.FileName = fileAltNameInfo.FileName;
  138. result = information;
  139. return NTStatus.STATUS_SUCCESS;
  140. }
  141. case QueryInformationLevel.SMB_QUERY_FILE_STREAM_INFO:
  142. {
  143. NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileStreamInformation);
  144. if (status != NTStatus.STATUS_SUCCESS)
  145. {
  146. return status;
  147. }
  148. FileStreamInformation fileStreamInfo = (FileStreamInformation)fileInfo;
  149. QueryFileStreamInfo information = new QueryFileStreamInfo();
  150. information.StreamSize = fileStreamInfo.StreamSize;
  151. information.StreamAllocationSize = fileStreamInfo.StreamAllocationSize;
  152. information.StreamName = fileStreamInfo.StreamName;
  153. result = information;
  154. return NTStatus.STATUS_SUCCESS;
  155. }
  156. case QueryInformationLevel.SMB_QUERY_FILE_COMPRESSION_INFO:
  157. {
  158. NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileCompressionInformation);
  159. if (status != NTStatus.STATUS_SUCCESS)
  160. {
  161. return status;
  162. }
  163. FileCompressionInformation fileCompressionInfo = (FileCompressionInformation)fileInfo;
  164. QueryFileCompressionInfo information = new QueryFileCompressionInfo();
  165. information.CompressedFileSize = fileCompressionInfo.CompressedFileSize;
  166. information.CompressionFormat = fileCompressionInfo.CompressionFormat;
  167. information.CompressionUnitShift = fileCompressionInfo.CompressionUnitShift;
  168. information.ChunkShift = fileCompressionInfo.ChunkShift;
  169. information.ClusterShift = fileCompressionInfo.ClusterShift;
  170. information.Reserved = fileCompressionInfo.Reserved;
  171. result = information;
  172. return NTStatus.STATUS_SUCCESS;
  173. }
  174. default:
  175. {
  176. result = null;
  177. return NTStatus.STATUS_OS2_INVALID_LEVEL;
  178. }
  179. }
  180. }
  181. }
  182. }