msg_file_change_notify.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package smb
  2. import "imuslab.com/smb/driver/mod/smb/encoder"
  3. // request_CHANGE_NOTIFY
  4. type CompletionFilter uint32
  5. const (
  6. FILE_NOTIFY_CHANGE_FILE_NAME CompletionFilter = 0x00000001
  7. FILE_NOTIFY_CHANGE_DIR_NAME CompletionFilter = 0x00000002
  8. FILE_NOTIFY_CHANGE_ATTRIBUTES CompletionFilter = 0x00000004
  9. FILE_NOTIFY_CHANGE_SIZE CompletionFilter = 0x00000008
  10. FILE_NOTIFY_CHANGE_LAST_WRITE CompletionFilter = 0x00000010
  11. FILE_NOTIFY_CHANGE_LAST_ACCESS CompletionFilter = 0x00000020
  12. FILE_NOTIFY_CHANGE_CREATION CompletionFilter = 0x00000040
  13. FILE_NOTIFY_CHANGE_EA CompletionFilter = 0x00000080
  14. FILE_NOTIFY_CHANGE_SECURITY CompletionFilter = 0x00000100
  15. FILE_NOTIFY_CHANGE_STREAM_NAME CompletionFilter = 0x00000200
  16. FILE_NOTIFY_CHANGE_STREAM_SIZE CompletionFilter = 0x00000400
  17. FILE_NOTIFY_CHANGE_STREAM_WRITE CompletionFilter = 0x00000800
  18. )
  19. var _ encoder.BinaryMarshallable = CompletionFilter(0)
  20. func (c CompletionFilter) MarshalBinary(meta *encoder.Metadata) ([]byte, error) {
  21. return MarshalBinary(c, meta, c)
  22. }
  23. func (c CompletionFilter) UnmarshalBinary(data []byte, meta *encoder.Metadata) (interface{}, error) {
  24. return UnmarshalBinary(c, data, meta, c)
  25. }
  26. func init() {
  27. commandRequestMap[CommandChangeNotify] = func() DataI {
  28. return &ChangeNotifyRequest{}
  29. }
  30. }
  31. type ChangeNotifyRequest struct {
  32. Header
  33. StructureSize uint16
  34. Flags uint16
  35. OutputBufferLength uint32
  36. FileId GUID
  37. CompletionFilter CompletionFilter //CompletionFilter
  38. Reserved uint32
  39. }
  40. type ChangeNotifyResponse struct {
  41. Header
  42. StructureSize uint16
  43. OutputBufferOffset uint16 `smb:"offset:OutputBuffer"`
  44. OutputBufferLength uint32 `smb:"len:OutputBuffer"`
  45. OutputBuffer []byte
  46. }
  47. func (data *ChangeNotifyRequest) ServerAction(ctx *DataCtx) (interface{}, error) {
  48. data.Header.Flags = SMB2_FLAGS_RESPONSE
  49. data.Header.Status = STATUS_PENDING
  50. ctx.session.notify[data.FileId] = data
  51. return ERR(data.Header, STATUS_PENDING)
  52. }