SMB1FileStoreHelper.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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 CreateDirectory(INTFileStore fileStore, string path, SecurityContext securityContext)
  17. {
  18. object handle;
  19. FileStatus fileStatus;
  20. NTStatus createStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.FILE_ADD_SUBDIRECTORY, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_CREATE, CreateOptions.FILE_DIRECTORY_FILE, securityContext);
  21. if (createStatus != NTStatus.STATUS_SUCCESS)
  22. {
  23. return createStatus;
  24. }
  25. fileStore.CloseFile(handle);
  26. return createStatus;
  27. }
  28. public static NTStatus DeleteDirectory(INTFileStore fileStore, string path, SecurityContext securityContext)
  29. {
  30. return Delete(fileStore, path, CreateOptions.FILE_DIRECTORY_FILE, securityContext);
  31. }
  32. public static NTStatus DeleteFile(INTFileStore fileStore, string path, SecurityContext securityContext)
  33. {
  34. return Delete(fileStore, path, CreateOptions.FILE_NON_DIRECTORY_FILE, securityContext);
  35. }
  36. public static NTStatus Delete(INTFileStore fileStore, string path, CreateOptions createOptions, SecurityContext securityContext)
  37. {
  38. object handle;
  39. FileStatus fileStatus;
  40. NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.DELETE, 0, CreateDisposition.FILE_OPEN, createOptions, securityContext);
  41. if (openStatus != NTStatus.STATUS_SUCCESS)
  42. {
  43. return openStatus;
  44. }
  45. FileDispositionInformation fileDispositionInfo = new FileDispositionInformation();
  46. fileDispositionInfo.DeletePending = true;
  47. NTStatus setStatus = fileStore.SetFileInformation(handle, fileDispositionInfo);
  48. if (setStatus != NTStatus.STATUS_SUCCESS)
  49. {
  50. return setStatus;
  51. }
  52. NTStatus closeStatus = fileStore.CloseFile(handle);
  53. return closeStatus;
  54. }
  55. public static NTStatus Rename(INTFileStore fileStore, string oldName, string newName, SMBFileAttributes searchAttributes, SecurityContext securityContext)
  56. {
  57. object handle;
  58. FileStatus fileStatus;
  59. CreateOptions createOptions = 0;
  60. if (searchAttributes == SMBFileAttributes.Normal)
  61. {
  62. createOptions = CreateOptions.FILE_NON_DIRECTORY_FILE;
  63. }
  64. else if ((searchAttributes & SMBFileAttributes.Directory) > 0)
  65. {
  66. createOptions = CreateOptions.FILE_DIRECTORY_FILE;
  67. }
  68. NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, oldName, DirectoryAccessMask.DELETE, 0, CreateDisposition.FILE_OPEN, createOptions, securityContext);
  69. if (openStatus != NTStatus.STATUS_SUCCESS)
  70. {
  71. return openStatus;
  72. }
  73. FileRenameInformationType2 renameInfo = new FileRenameInformationType2();
  74. renameInfo.ReplaceIfExists = false;
  75. renameInfo.FileName = newName;
  76. NTStatus setStatus = fileStore.SetFileInformation(handle, renameInfo);
  77. if (setStatus != NTStatus.STATUS_SUCCESS)
  78. {
  79. return setStatus;
  80. }
  81. NTStatus closeStatus = fileStore.CloseFile(handle);
  82. return closeStatus;
  83. }
  84. public static NTStatus CheckDirectory(INTFileStore fileStore, string path, SecurityContext securityContext)
  85. {
  86. object handle;
  87. FileStatus fileStatus;
  88. NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, securityContext);
  89. if (openStatus != NTStatus.STATUS_SUCCESS)
  90. {
  91. return openStatus;
  92. }
  93. fileStore.CloseFile(handle);
  94. return NTStatus.STATUS_SUCCESS;
  95. }
  96. public static NTStatus QueryInformation(out FileNetworkOpenInformation fileInfo, INTFileStore fileStore, string path, SecurityContext securityContext)
  97. {
  98. object handle;
  99. FileStatus fileStatus;
  100. 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);
  101. if (openStatus != NTStatus.STATUS_SUCCESS)
  102. {
  103. fileInfo = null;
  104. return openStatus;
  105. }
  106. fileInfo = NTFileStoreHelper.GetNetworkOpenInformation(fileStore, handle);
  107. return NTStatus.STATUS_SUCCESS;
  108. }
  109. public static NTStatus SetInformation(INTFileStore fileStore, string path, SMBFileAttributes fileAttributes, DateTime? lastWriteTime, SecurityContext securityContext)
  110. {
  111. object handle;
  112. FileStatus fileStatus;
  113. NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_WRITE_ATTRIBUTES, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext);
  114. if (openStatus != NTStatus.STATUS_SUCCESS)
  115. {
  116. return openStatus;
  117. }
  118. FileBasicInformation basicInfo = new FileBasicInformation();
  119. basicInfo.LastWriteTime = lastWriteTime;
  120. if ((fileAttributes & SMBFileAttributes.Hidden) > 0)
  121. {
  122. basicInfo.FileAttributes |= FileAttributes.Hidden;
  123. }
  124. if ((fileAttributes & SMBFileAttributes.ReadOnly) > 0)
  125. {
  126. basicInfo.FileAttributes |= FileAttributes.ReadOnly;
  127. }
  128. if ((fileAttributes & SMBFileAttributes.Archive) > 0)
  129. {
  130. basicInfo.FileAttributes |= FileAttributes.Archive;
  131. }
  132. return fileStore.SetFileInformation(handle, basicInfo);
  133. }
  134. public static NTStatus SetInformation2(INTFileStore fileStore, object handle, DateTime? creationTime, DateTime? lastAccessTime, DateTime? lastWriteTime)
  135. {
  136. FileNetworkOpenInformation fileInfo = NTFileStoreHelper.GetNetworkOpenInformation(fileStore, handle);
  137. FileBasicInformation basicInfo = new FileBasicInformation();
  138. basicInfo.FileAttributes = fileInfo.FileAttributes;
  139. basicInfo.CreationTime = creationTime;
  140. basicInfo.LastAccessTime = lastAccessTime;
  141. basicInfo.LastWriteTime = lastWriteTime;
  142. return fileStore.SetFileInformation(handle, basicInfo);
  143. }
  144. public static SMBFileAttributes GetFileAttributes(FileAttributes attributes)
  145. {
  146. SMBFileAttributes result = SMBFileAttributes.Normal;
  147. if ((attributes & FileAttributes.Hidden) > 0)
  148. {
  149. result |= SMBFileAttributes.Hidden;
  150. }
  151. if ((attributes & FileAttributes.ReadOnly) > 0)
  152. {
  153. result |= SMBFileAttributes.ReadOnly;
  154. }
  155. if ((attributes & FileAttributes.Archive) > 0)
  156. {
  157. result |= SMBFileAttributes.Archive;
  158. }
  159. if ((attributes & FileAttributes.Directory) > 0)
  160. {
  161. result |= SMBFileAttributes.Directory;
  162. }
  163. return result;
  164. }
  165. }
  166. }