msg_file_write.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package smb
  2. func init() {
  3. commandRequestMap[CommandWrite] = func() DataI {
  4. return &WriteRequest{}
  5. }
  6. }
  7. //CommandWrite
  8. type WriteRequest struct {
  9. Header
  10. StructureSize uint16
  11. DataOffset uint16 `smb:"offset:Data"`
  12. DataLength uint32 `smb:"len:Data"`
  13. FileOffset uint64
  14. FileId GUID
  15. Channel uint32
  16. RemainingBytes uint32
  17. WriteChannelInfoOffset uint16 `smb:"offset:WriteChannelInfo"`
  18. WriteChannelInfoLength uint16 `smb:"len:WriteChannelInfo"`
  19. Flags uint32
  20. Data []byte
  21. // WriteChannelInfo []byte
  22. }
  23. type WriteResponse struct {
  24. Header
  25. StructureSize uint16
  26. Reserved uint16
  27. Count uint32
  28. Remaining uint32
  29. WriteChannelInfoOffset uint16 `smb:"offset:WriteChannelInfo"`
  30. WriteChannelInfoLength uint16 `smb:"len:WriteChannelInfo"`
  31. WriteChannelInfo []byte
  32. }
  33. func (data *WriteRequest) ServerAction(ctx *DataCtx) (interface{}, error) {
  34. data.Header.Flags = SMB2_FLAGS_RESPONSE
  35. if data.Header.Flags&SMB2_FLAGS_PRIORITY_MASK == SMB2_FLAGS_PRIORITY_MASK {
  36. return ERR(data.Header, STATUS_NOT_SUPPORTED)
  37. }
  38. if data.DataLength > kMaxTransactSize ||
  39. data.DataLength == 0 ||
  40. // data.Channel != 0 ||
  41. len(data.Data) == 0 ||
  42. len(data.Data) != int(data.DataLength) {
  43. return ERR(data.Header, StatusInvalidParameter)
  44. }
  45. fileid := ctx.FileID(data.FileId)
  46. webfile, ok := ctx.session.openedFiles[fileid]
  47. if !ok {
  48. return ERR(data.Header, STATUS_FILE_CLOSED)
  49. }
  50. if fileid.IsSvrSvc(ctx.session) {
  51. return DcerpcWrite(ctx, data)
  52. }
  53. _, err := webfile.Seek(int64(data.FileOffset), 0)
  54. if err != nil {
  55. return ERR(data.Header, STATUS_UNSUCCESSFUL)
  56. }
  57. doneSize, err := webfile.Write(data.Data)
  58. if err != nil {
  59. return ERR(data.Header, STATUS_UNSUCCESSFUL)
  60. }
  61. resp := WriteResponse{
  62. Count: uint32(doneSize),
  63. Header: data.Header,
  64. StructureSize: 17,
  65. }
  66. return &resp, nil
  67. }
  68. // //////////////////////////////////////////////////////////////////////
  69. func NewWriteResponse() WriteResponse {
  70. return WriteResponse{}
  71. }
  72. // Channel属性
  73. const (
  74. SMB2_CHANNEL_NONE = 0x00000000
  75. SMB2_CHANNEL_RDMA_V1 = 0x00000001
  76. SMB2_CHANNEL_RDMA_V1_INVALIDATE = 0x00000002
  77. SMB2_CHANNEL_RDMA_TRANSFORM = 0x00000003
  78. )
  79. // 写入请求
  80. func (c *SessionC) NewWriteRequest(treeId uint32, fileId, buf []byte) WriteRequest {
  81. smb2Header := c.newHeader(CommandWrite)
  82. smb2Header.Credits = 127
  83. smb2Header.TreeID = treeId
  84. return WriteRequest{
  85. Header: smb2Header,
  86. StructureSize: 49,
  87. // FileId: fileId,
  88. Channel: SMB2_CHANNEL_NONE,
  89. RemainingBytes: 0,
  90. Flags: 0,
  91. Data: buf,
  92. }
  93. }