msg_file_info_______model.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package smb
  2. import "imuslab.com/smb/driver/mod/smb/encoder"
  3. /// [MS-FSCC] 2.4 - File Information Classes
  4. // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/4718fc40-e539-4014-8e33-b675af74e3e1
  5. type FileInformationClass uint8
  6. const (
  7. FileDirectoryInformation FileInformationClass = 0x01 // Uses: Query
  8. // FileFullDirectoryInformation FileInformationClass = 0x02 // Uses: Query
  9. // FileBothDirectoryInformation FileInformationClass = 0x03 // Uses: Query
  10. FileBasicInformation FileInformationClass = 0x04 // Uses: Query, Set
  11. // FileStandardInformation FileInformationClass = 0x05 // Uses: Query
  12. // FileInternalInformation FileInformationClass = 0x06 // Uses: Query
  13. // FileEaInformation FileInformationClass = 0x07 // Uses: Query
  14. // FileAccessInformation FileInformationClass = 0x08 // Uses: Query
  15. // FileNameInformation FileInformationClass = 0x09 // Uses: LOCAL
  16. FileRenameInformation FileInformationClass = 0x0A // Uses: Set
  17. // FileLinkInformation FileInformationClass = 0x0B // Uses: Set
  18. // FileNamesInformation FileInformationClass = 0x0C // Uses: Query
  19. FileDispositionInformation FileInformationClass = 0x0D // Uses: Set
  20. // FilePositionInformation FileInformationClass = 0x0E // Uses: Query, Set
  21. // FileFullEaInformation FileInformationClass = 0x0F // Uses: Query, Set
  22. // FileModeInformation FileInformationClass = 0x10 // Uses: Query, Set
  23. // FileAlignmentInformation FileInformationClass = 0x11 // Uses: Query
  24. FileAllInformation FileInformationClass = 0x12 // Uses: Query
  25. // FileAllocationInformation FileInformationClass = 0x13 // Uses: Set
  26. // FileEndOfFileInformation FileInformationClass = 0x14 // Uses: Set
  27. // FileAlternateNameInformation FileInformationClass = 0x15 // Uses: Query
  28. FileStreamInformation FileInformationClass = 0x16 // Uses: Query
  29. // FilePipeInformation FileInformationClass = 0x17 // Uses: Query, Set
  30. // FilePipeLocalInformation FileInformationClass = 0x18 // Uses: Query
  31. // FilePipeRemoteInformation FileInformationClass = 0x19 // Uses: Query
  32. // FileCompressionInformation FileInformationClass = 0x1C // Uses: Query
  33. // FileNetworkOpenInformation FileInformationClass = 0x22 // Uses: Query
  34. // FileAttributeTagInformation FileInformationClass = 0x23 // Uses: Query
  35. FileIdBothDirectoryInformation FileInformationClass = 0x25 // Uses: Query
  36. // FileIdFullDirectoryInformation FileInformationClass = 0x26 // Uses: Query
  37. // FileValidDataLengthInformation FileInformationClass = 0x27 // Uses: Set
  38. // FileShortNameInformation FileInformationClass = 0x28 // Uses: Set
  39. )
  40. func (c FileInformationClass) MarshalBinary(meta *encoder.Metadata) ([]byte, error) {
  41. return MarshalBinary(c, meta, c)
  42. }
  43. func (c FileInformationClass) UnmarshalBinary(data []byte, meta *encoder.Metadata) (interface{}, error) {
  44. return UnmarshalBinary(c, data, meta, c)
  45. }
  46. type FileSystemInformationClass uint8
  47. const (
  48. // FileFsVolumeInformation FileSystemInformationClass = 0x01 // Uses: Query
  49. // // FileFsLabelInformation FileSystemInformationClass = 0x02
  50. FileFsSizeInformation FileSystemInformationClass = 0x03 // Uses: Query
  51. // FileFsDeviceInformation FileSystemInformationClass = 0x04 // Uses: Query
  52. FileFsAttributeInformation FileSystemInformationClass = 0x05 // Uses: Query
  53. // FileFsControlInformation FileSystemInformationClass = 0x06 // Uses: Query Set
  54. // FileFsFullSizeInformation FileSystemInformationClass = 0x07 // Uses: Query
  55. // FileFsObjectIdInformation FileSystemInformationClass = 0x08 // Uses: Query Set
  56. // FileFsDriverPathInformation FileSystemInformationClass = 0x09
  57. // // FileFsVolumeFlagsInformation FileSystemInformationClass = 0x0A
  58. // FileFsSectorSizeInformation FileSystemInformationClass = 0x0B // Uses: Query
  59. )
  60. type FileDirectoryInfo struct {
  61. //https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/b38bf518-9057-4c88-9ddd-5e2d3976a64b
  62. NextOffset uint32
  63. FileIndex uint32
  64. CreateTime uint64
  65. LastAccessTime uint64
  66. LastWriteTime uint64
  67. LastChangeTime uint64
  68. EndOfFile uint64
  69. AllocationSize uint64
  70. FileAttributes FileAttributes
  71. FileNameLength uint32 `smb:"len:FileName"`
  72. FileName []byte
  73. Reserved3 uint16
  74. }
  75. // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/4718fc40-e539-4014-8e33-b675af74e3e1
  76. type FileIdBothDirectoryInfo struct {
  77. //https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/1e144bff-c056-45aa-bd29-c13d214ee2ba
  78. NextOffset uint32
  79. FileIndex uint32
  80. CreateTime uint64
  81. LastAccessTime uint64
  82. LastWriteTime uint64
  83. LastChangeTime uint64
  84. EndOfFile uint64
  85. AllocationSize uint64
  86. FileAttributes FileAttributes
  87. FileNameLength uint32 `smb:"len:FileName"`
  88. EASize uint32
  89. ShortNameLength uint8
  90. Reserved1 uint8
  91. ShortName []byte `smb:"fixed:24"`
  92. Reserved2 uint16
  93. FileId uint64
  94. FileName []byte
  95. Reserved3 uint16
  96. }
  97. type SMB2_FILE_ALL_INFO struct {
  98. // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/95f3056a-ebc1-4f5d-b938-3f68a44677a6
  99. //BasicInformation
  100. CreateTime uint64
  101. LastAccessTime uint64
  102. LastWriteTime uint64
  103. LastChangeTime uint64
  104. FileAttributes uint32
  105. Unknown uint32
  106. //StandardInformation
  107. AllocationSize uint64
  108. EndOfFile uint64
  109. NumberOfLinks uint32
  110. DeletePending uint8
  111. IsDirectory uint8
  112. Reserved uint16
  113. //InternalInformation
  114. FileID uint64
  115. EASize uint32
  116. AccessMask AccessMask
  117. PositionInformation uint64
  118. ModeInformation uint32
  119. AlignmentInformation uint32
  120. FileNameLength uint32 `smb:"len:FileName"`
  121. FileName []byte
  122. }
  123. type FileBasicInformationX struct {
  124. CreateTime uint64
  125. LastAccess uint64
  126. LastWrite uint64
  127. LastChange uint64
  128. FileAttributes FileAttributes
  129. Reserved uint32
  130. }
  131. type FileDispositionInformationX struct {
  132. //https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/12c3dd1c-14f6-4229-9d29-75fb2cb392f6
  133. DeletePending uint8
  134. }
  135. type FileRenameInformationX struct {
  136. // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/52aa0b70-8094-4971-862d-79793f41e6a8
  137. ReplaceIfExists uint8
  138. Reserved []byte `smb:"fixed:7"`
  139. RootDirHandle uint64
  140. FileNameLength uint32 `smb:"len:FileName"`
  141. FileName []byte
  142. }
  143. func Duiqi4Byte(buf []byte) []byte {
  144. if len(buf)%4 != 0 {
  145. buf2 := make([]byte, (len(buf)/4+1)*4)
  146. copy(buf2, buf)
  147. return buf2
  148. }
  149. return buf
  150. }
  151. type FileStreamInformationX struct {
  152. //每次都需要4直接对齐
  153. NextOffset uint32
  154. StreamNameLength uint32 `smb:"len:StreamName"`
  155. StreamSize uint64
  156. StreamAllocationSize uint64
  157. StreamName []byte
  158. Reserved uint32
  159. }
  160. // handle_QueryInfo
  161. type InfoType uint8
  162. const (
  163. SMB2_0_INFO_FILE InfoType = 0x01 //FILE_INFO
  164. SMB2_0_INFO_FILESYSTEM InfoType = 0x02 //FS_INFO
  165. SMB2_0_INFO_SECURITY InfoType = 0x03
  166. SMB2_0_INFO_QUOTA InfoType = 0x04
  167. )
  168. func (c InfoType) MarshalBinary(meta *encoder.Metadata) ([]byte, error) {
  169. return MarshalBinary(c, meta, c)
  170. }
  171. func (c InfoType) UnmarshalBinary(data []byte, meta *encoder.Metadata) (interface{}, error) {
  172. return UnmarshalBinary(c, data, meta, c)
  173. }
  174. type FileFsAttributeInformationX struct {
  175. //https://wiki.wireshark.org/SMB2/SMB2_FS_ATTRIBUTE_INFO.md
  176. FSAttributes uint32
  177. MaxNameLength uint32
  178. LabelLength uint32 `smb:"len:FSName"`
  179. FSName []byte
  180. }
  181. type FileFsSizeInformationX struct {
  182. AllocationSize uint64
  183. FreeUnits uint64
  184. SectorsUnit uint32
  185. BytesPerSector uint32
  186. }