msg_file_create_ext.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package smb
  2. import (
  3. "imuslab.com/smb/driver/mod/smb/encoder"
  4. )
  5. // type SMB2_CREATE_CONTEXT_REQUEST_TYPE string
  6. // const (
  7. // SMB2_CREATE_EA_BUFFER SMB2_CREATE_CONTEXT_REQUEST_TYPE = "ExtA"
  8. // SMB2_CREATE_SD_BUFFER SMB2_CREATE_CONTEXT_REQUEST_TYPE = "SecD"
  9. // SMB2_CREATE_DURABLE_HANDLE_REQUEST SMB2_CREATE_CONTEXT_REQUEST_TYPE = "DHnQ"
  10. // SMB2_CREATE_DURABLE_HANDLE_RECONNECT SMB2_CREATE_CONTEXT_REQUEST_TYPE = "DHnC"
  11. // SMB2_CREATE_ALLOCATION_SIZE SMB2_CREATE_CONTEXT_REQUEST_TYPE = "AISi"
  12. // SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST SMB2_CREATE_CONTEXT_REQUEST_TYPE = "MxAc"
  13. // SMB2_CREATE_TIMEWARP_TOKEN SMB2_CREATE_CONTEXT_REQUEST_TYPE = "TWrp"
  14. // SMB2_CREATE_QUERY_ON_DISK_ID SMB2_CREATE_CONTEXT_REQUEST_TYPE = "QFid"
  15. // SMB2_CREATE_REQUEST_LEASE SMB2_CREATE_CONTEXT_REQUEST_TYPE = "RqLs"
  16. // SMB2_CREATE_REQUEST_LEASE_V2 SMB2_CREATE_CONTEXT_REQUEST_TYPE = "RqLs"
  17. // SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 SMB2_CREATE_CONTEXT_REQUEST_TYPE = "DH2Q"
  18. // SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2 SMB2_CREATE_CONTEXT_REQUEST_TYPE = "DH2C"
  19. // )
  20. type SMB2_CREATE_CONTEXT_RESPONSE_TYPE string
  21. const (
  22. // SMB2_CREATE_DURABLE_HANDLE_RESPONSE_TAG SMB2_CREATE_CONTEXT_RESPONSE_TYPE = "DHnQ"
  23. SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE_TAG SMB2_CREATE_CONTEXT_RESPONSE_TYPE = "MxAc"
  24. // SMB2_CREATE_QUERY_ON_DISK_ID_TAG SMB2_CREATE_CONTEXT_RESPONSE_TYPE = "QFid"
  25. // SMB2_CREATE_RESPONSE_LEASE_TAG SMB2_CREATE_CONTEXT_RESPONSE_TYPE = "RqLs"
  26. SMB2_APPL_CREATE_CONTENT_TAG SMB2_CREATE_CONTEXT_RESPONSE_TYPE = "AAPL"
  27. )
  28. type SMB2_CREATE_CONTEXT_REQUEST struct {
  29. Next uint32
  30. TagOffset uint16 `smb:"offset:Tag"`
  31. TagLength uint16 `smb:"len:Tag"`
  32. Reserved uint16
  33. DataOffset uint16 `smb:"offset:Data"`
  34. DataLength uint32 `smb:"len:Data"`
  35. Tag []byte
  36. Reserved2 uint32
  37. Data []byte
  38. }
  39. func (s *SMB2_CREATE_CONTEXT_REQUEST) Action(actioncb func(SMB2_CREATE_CONTEXT_RESPONSE_TYPE, interface{}) (interface{}, error)) []byte {
  40. tag := SMB2_CREATE_CONTEXT_RESPONSE_TYPE(s.Tag)
  41. // logx.Printf("create ext type : %v", tag)
  42. var data interface{}
  43. switch tag {
  44. // case SMB2_CREATE_DURABLE_HANDLE_RESPONSE_TAG:
  45. case SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE_TAG:
  46. data = &SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST{}
  47. // case SMB2_CREATE_QUERY_ON_DISK_ID_TAG:
  48. // case SMB2_CREATE_RESPONSE_LEASE_TAG:
  49. case SMB2_APPL_CREATE_CONTENT_TAG:
  50. data = &SMB2_APPL_CREATE_CONTENT_TAG_REQUEST{}
  51. default:
  52. return nil
  53. }
  54. resp, err := actioncb(tag, data)
  55. if err != nil {
  56. return nil
  57. }
  58. respBuf, err := encoder.Marshal(resp)
  59. if err != nil {
  60. return nil
  61. }
  62. s.Data = respBuf
  63. sBuf, err := encoder.Marshal(s)
  64. if err != nil {
  65. return nil
  66. }
  67. return sBuf
  68. }
  69. type SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST struct {
  70. Timestamp uint64
  71. }
  72. type SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE struct {
  73. QueryStatus uint32
  74. MaximalAccess AccessMask //MaximalAccess
  75. }
  76. type SMB2_APPL_CREATE_CONTENT_TAG_REQUEST struct {
  77. ServerQuery uint32
  78. Reserved uint32
  79. QueryBitmask uint64
  80. ClientServerCap uint64
  81. }
  82. type SMB2_APPL_CREATE_CONTENT_TAG_RESPONSE struct {
  83. ServerQuery uint32
  84. Reserved uint32
  85. QueryBitmask uint64
  86. ClientServerCap uint64
  87. VolumeCap uint64
  88. ModelStringLen uint16 `smb:"len:ModelString"`
  89. ModelString uint16
  90. }