ruby_smb 0.0.20 → 0.0.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -3
  4. data/examples/pipes.rb +45 -0
  5. data/lib/ruby_smb/client.rb +25 -3
  6. data/lib/ruby_smb/client/negotiation.rb +10 -3
  7. data/lib/ruby_smb/nbss/session_header.rb +3 -3
  8. data/lib/ruby_smb/smb1.rb +1 -0
  9. data/lib/ruby_smb/smb1/bit_field.rb +1 -0
  10. data/lib/ruby_smb/smb1/bit_field/trans_flags.rb +15 -0
  11. data/lib/ruby_smb/smb1/commands.rb +1 -0
  12. data/lib/ruby_smb/smb1/packet.rb +1 -0
  13. data/lib/ruby_smb/smb1/packet/trans.rb +16 -0
  14. data/lib/ruby_smb/smb1/packet/trans/data_block.rb +49 -0
  15. data/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request.rb +24 -0
  16. data/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response.rb +59 -0
  17. data/lib/ruby_smb/smb1/packet/trans/request.rb +50 -0
  18. data/lib/ruby_smb/smb1/packet/trans/response.rb +46 -0
  19. data/lib/ruby_smb/smb1/packet/trans/subcommands.rb +11 -0
  20. data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +1 -1
  21. data/lib/ruby_smb/smb1/pipe.rb +65 -0
  22. data/lib/ruby_smb/smb1/tree.rb +8 -1
  23. data/lib/ruby_smb/smb2.rb +1 -0
  24. data/lib/ruby_smb/smb2/file.rb +6 -6
  25. data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +1 -0
  26. data/lib/ruby_smb/smb2/pipe.rb +69 -0
  27. data/lib/ruby_smb/smb2/tree.rb +11 -1
  28. data/lib/ruby_smb/version.rb +1 -1
  29. data/spec/lib/ruby_smb/nbss/session_header_spec.rb +4 -4
  30. data/spec/lib/ruby_smb/smb1/bit_field/trans_flags_spec.rb +26 -0
  31. data/spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request_spec.rb +47 -0
  32. data/spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response_spec.rb +31 -0
  33. data/spec/lib/ruby_smb/smb1/packet/trans/request_spec.rb +94 -0
  34. data/spec/lib/ruby_smb/smb1/packet/trans/response_spec.rb +85 -0
  35. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +1 -1
  36. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +65 -0
  37. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +64 -0
  38. metadata +27 -2
  39. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b4dff3ea0843193837a2e7ca9f8f0ab4a7fd2eea
4
- data.tar.gz: 7b8e7321255ff7da69f8aba3658c3f5f6769325e
3
+ metadata.gz: 816022485d644911d10d8001578a7eb49206edc3
4
+ data.tar.gz: bcf4688f01257ffd062adbd8fa2cb94843365687
5
5
  SHA512:
6
- metadata.gz: 129e91974e7487ed551eb69506ecd7c7adb92a1b528b135a3bece8387fcb45acde5abde401475c03d469732a94dfd38aaa1f30b810acf641796e7860797b0b3c
7
- data.tar.gz: 1233ed26721566ce8f86ea7e8eea3572b959251ae9db1faa6d1f84b324fc9c06a392c823b2551d2161972aaebb190920b465869e6bd97046ca67ec6dc4fb96db
6
+ metadata.gz: b53ba46aac705524d9c60b27b4c02f9dc9be9f58c5b516596b05780c962eb527f57a5537bcc17882c016d3e63baff4ea4357360faa7fb7c8004687a4d3fc8e16
7
+ data.tar.gz: e442a5af8c2e22740f2d1f137677b55953548d30b86d4a32895cb600833c4624ec2895056610e3f3a9f0fa1afae6799907ba98b2d4c168f6b2e6c8cb20239848
Binary file
data.tar.gz.sig CHANGED
@@ -1,3 +1,2 @@
1
- �m\Y��ӐLE��|ٰ�
2
- }��,l^��)�1���!�;#���bk��&(�J�A
3
- ���>)b�f�Ժ���r�̫-����9�>�i1�qM��I,�mD�$bZOp�OC7��E0�m8��$���y����K��>�\�~�{��/���;t�Ќ�5=W��z:�����y������o~x�����T?����/�e���l
1
+ ��S&��3K��O��y�>�!�T�a5IoX`6m�[��Ŝ'��׸���^ׯ;/�l�
2
+ ��.��}9����P$
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/ruby
2
+
3
+ #
4
+ # Example script for connecting to a named pipe and performing a peek operation.
5
+ # This is used to demonstrate pipe operations.
6
+ #
7
+ # Usage: ruby pipes.rb ADDRESS PIPENAME USER PASS 1|2
8
+ #
9
+
10
+ require 'bundler/setup'
11
+ require 'ruby_smb'
12
+
13
+ address = ARGV[0]
14
+ pipename = ARGV[1]
15
+ username = ARGV[2]
16
+ password = ARGV[3]
17
+ smbver = ARGV[4].to_i
18
+
19
+ sock = TCPSocket.new(address, 445)
20
+ dispatcher = RubySMB::Dispatcher::Socket.new(sock)
21
+
22
+ if smbver == 2
23
+ client = RubySMB::Client.new(dispatcher, smb1: false, username: username, password: password)
24
+ client.negotiate
25
+ puts "ServerMaxRead: #{client.server_max_read_size}"
26
+ puts "ServerMaxWrite: #{client.server_max_write_size}"
27
+ puts "ServerMaxTrans: #{client.server_max_transact_size}"
28
+ elsif smbver == 1
29
+ client = RubySMB::Client.new(dispatcher, smb2: false, username: username, password: password)
30
+ client.negotiate
31
+ puts "ServerMaxBuffer: #{client.server_max_buffer_size}"
32
+ end
33
+
34
+ client.authenticate
35
+ client.tree_connect("\\\\#{address}\\IPC$")
36
+ pipe = client.create_pipe(pipename, nil)
37
+
38
+ puts "Available: #{pipe.peek_available}"
39
+ puts "PipeState: #{pipe.peek_state}" # 3 == OK
40
+ puts "IsConnected: #{pipe.is_connected?}"
41
+
42
+ pipe.close
43
+ puts "IsConnected: #{pipe.is_connected?}"
44
+ client.tree_connects[-1].disconnect!
45
+ client.disconnect!
@@ -23,7 +23,9 @@ module RubySMB
23
23
  # Dialect value for SMB2 Default (Version 2.02)
24
24
  SMB2_DIALECT_DEFAULT = 0x0202
25
25
  # The default maximum size of a SMB message that the Client accepts (in bytes)
26
- MAX_BUFFER_SIZE = 4356
26
+ MAX_BUFFER_SIZE = 64512
27
+ # The default maximum size of a SMB message that the Server accepts (in bytes)
28
+ SERVER_MAX_BUFFER_SIZE = 4356
27
29
 
28
30
  # The dispatcher responsible for sending packets
29
31
  # @!attribute [rw] dispatcher
@@ -158,7 +160,23 @@ module RubySMB
158
160
  # @return [Integer]
159
161
  attr_accessor :server_max_buffer_size
160
162
 
161
- # @param dispatcher [RubySMB::Dispacther::Socket] the packet dispatcher to use
163
+ # The maximum size SMB2 write request that the Server accepts (in bytes)
164
+ # @!attribute [rw] server_max_write_size
165
+ # @return [Integer]
166
+ attr_accessor :server_max_write_size
167
+
168
+ # The maximum size SMB2 read request that the Server accepts (in bytes)
169
+ # @!attribute [rw] server_max_read_size
170
+ # @return [Integer]
171
+ attr_accessor :server_max_read_size
172
+
173
+ # The maximum size SMB2 transaction that the Server accepts (in bytes)
174
+ # For transactions that are not a read or write request
175
+ # @!attribute [rw] server_max_transact_size
176
+ # @return [Integer]
177
+ attr_accessor :server_max_transact_size
178
+
179
+ # @param dispatcher [RubySMB::Dispatcher::Socket] the packet dispatcher to use
162
180
  # @param smb1 [Boolean] whether or not to enable SMB1 support
163
181
  # @param smb2 [Boolean] whether or not to enable SMB2 support
164
182
  def initialize(dispatcher, smb1: true, smb2: true, username:, password:, domain: '.', local_workstation: 'WORKSTATION')
@@ -178,7 +196,11 @@ module RubySMB
178
196
  @smb2 = smb2
179
197
  @username = username.encode('utf-8') || ''.encode('utf-8')
180
198
  @max_buffer_size = MAX_BUFFER_SIZE
181
- @server_max_buffer_size = MAX_BUFFER_SIZE
199
+ # These sizes will be modifed during negotiation
200
+ @server_max_buffer_size = SERVER_MAX_BUFFER_SIZE
201
+ @server_max_read_size = RubySMB::SMB2::File::MAX_PACKET_SIZE
202
+ @server_max_write_size = RubySMB::SMB2::File::MAX_PACKET_SIZE
203
+ @server_max_transact_size = RubySMB::SMB2::File::MAX_PACKET_SIZE
182
204
 
183
205
  negotiate_version_flag = 0x02000000
184
206
  flags = Net::NTLM::Client::DEFAULT_FLAGS |
@@ -82,14 +82,21 @@ module RubySMB
82
82
  self.smb2 = false
83
83
  self.signing_required = packet.parameter_block.security_mode.security_signatures_required == 1
84
84
  self.dialect = packet.negotiated_dialect.to_s
85
- self.server_max_buffer_size = packet.parameter_block.max_buffer_size
85
+ # MaxBufferSize is largest message server will receive, measured from start of the SMB header. Subtract 260
86
+ # for protocol overhead. Then this value can be used for max read/write size without having to factor in
87
+ # protocol overhead every time.
88
+ self.server_max_buffer_size = packet.parameter_block.max_buffer_size - 260
86
89
  'SMB1'
87
90
  when RubySMB::SMB2::Packet::NegotiateResponse
88
91
  self.smb1 = false
89
92
  self.smb2 = true
90
93
  self.signing_required = packet.security_mode.signing_required == 1
91
94
  self.dialect = "0x%04x" % packet.dialect_revision
92
- self.server_max_buffer_size = 16644
95
+ self.server_max_read_size = packet.max_read_size
96
+ self.server_max_write_size = packet.max_write_size
97
+ self.server_max_transact_size = packet.max_transact_size
98
+ # This value is used in SMB1 only but calculate a valid value anyway
99
+ self.server_max_buffer_size = [self.server_max_read_size, self.server_max_write_size, self.server_max_transact_size].min
93
100
  'SMB2'
94
101
  end
95
102
 
@@ -102,7 +109,7 @@ module RubySMB
102
109
  def smb1_negotiate_request
103
110
  packet = RubySMB::SMB1::Packet::NegotiateRequest.new
104
111
  # Default to always enabling Extended Security. It simplifies the Negotiation process
105
- # while being gauranteed to work with any modern Windows system. We can get more sophisticated
112
+ # while being guaranteed to work with any modern Windows system. We can get more sophisticated
106
113
  # with switching this on and off at a later date if the need arises.
107
114
  packet.smb_header.flags2.extended_security = 1
108
115
  # There is no real good reason to ever send an SMB1 Negotiate packet
@@ -5,9 +5,9 @@ module RubySMB
5
5
  class SessionHeader < BinData::Record
6
6
  endian :big
7
7
 
8
- uint8 :session_packet_type, label: 'Session Packet Type'
9
- uint8 :flags, label: 'Flags', initial_value: 0
10
- uint16 :packet_length, label: 'Packet Length'
8
+ uint8 :session_packet_type, label: 'Session Packet Type'
9
+ bit7 :flags, label: 'Flags', initial_value: 0
10
+ bit17 :packet_length, label: 'Packet Length'
11
11
  end
12
12
  end
13
13
  end
@@ -18,5 +18,6 @@ module RubySMB
18
18
  require 'ruby_smb/smb1/packet'
19
19
  require 'ruby_smb/smb1/tree'
20
20
  require 'ruby_smb/smb1/file'
21
+ require 'ruby_smb/smb1/pipe'
21
22
  end
22
23
  end
@@ -10,6 +10,7 @@ module RubySMB
10
10
  require 'ruby_smb/smb1/bit_field/optional_support'
11
11
  require 'ruby_smb/smb1/bit_field/directory_access_mask'
12
12
  require 'ruby_smb/smb1/bit_field/file_access_mask'
13
+ require 'ruby_smb/smb1/bit_field/trans_flags'
13
14
  require 'ruby_smb/smb1/bit_field/trans2_flags'
14
15
  require 'ruby_smb/smb1/bit_field/open2_flags'
15
16
  require 'ruby_smb/smb1/bit_field/open2_access_mode'
@@ -0,0 +1,15 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module BitField
4
+ # The Flags bit-field for a Trans Request Packet
5
+ # [2.2.4.33.1 Request](https://msdn.microsoft.com/en-us/library/ee441730.aspx)
6
+ class TransFlags < BinData::Record
7
+ endian :little
8
+ bit6 :reserved, label: 'Reserved Space', initial_value: 0
9
+ bit1 :no_response, label: 'Do Not reply', initial_value: 0
10
+ bit1 :disconnect, label: 'Disconnect Tree', initial_value: 0
11
+ bit8 :reserved2, label: 'Reserved Space', initial_value: 0
12
+ end
13
+ end
14
+ end
15
+ end
@@ -2,6 +2,7 @@ module RubySMB
2
2
  module SMB1
3
3
  module Commands
4
4
  SMB_COM_CLOSE = 0x04
5
+ SMB_COM_TRANSACTION = 0x25
5
6
  SMB_COM_ECHO = 0x2B
6
7
  SMB_COM_READ_ANDX = 0x2E
7
8
  SMB_COM_WRITE_ANDX = 0x2F
@@ -19,6 +19,7 @@ module RubySMB
19
19
  require 'ruby_smb/smb1/packet/logoff_response'
20
20
  require 'ruby_smb/smb1/packet/echo_request'
21
21
  require 'ruby_smb/smb1/packet/echo_response'
22
+ require 'ruby_smb/smb1/packet/trans'
22
23
  require 'ruby_smb/smb1/packet/trans2'
23
24
  require 'ruby_smb/smb1/packet/nt_trans'
24
25
  require 'ruby_smb/smb1/packet/nt_create_andx_request'
@@ -0,0 +1,16 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ # Namespace for the Transaction sub-protocol documented in
5
+ # [2.2.4.33 SMB_COM_TRANSACTION (0x25)](https://msdn.microsoft.com/en-us/library/ee441489.aspx)
6
+ module Trans
7
+ require 'ruby_smb/smb1/packet/trans/subcommands'
8
+ require 'ruby_smb/smb1/packet/trans/data_block'
9
+ require 'ruby_smb/smb1/packet/trans/request'
10
+ require 'ruby_smb/smb1/packet/trans/response'
11
+ require 'ruby_smb/smb1/packet/trans/peek_nmpipe_request'
12
+ require 'ruby_smb/smb1/packet/trans/peek_nmpipe_response'
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,49 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans
5
+ # Extends the {RubySMB::SMB1::DataBlock} to include padding methods
6
+ # that all Trans DataBlocks will need to handle proper byte alignment.
7
+ class DataBlock < RubySMB::SMB1::DataBlock
8
+ # Controls whether the padding fields will be used
9
+ # @!attribute [rw] enable_padding
10
+ # @return [Boolean]
11
+ attr_accessor :enable_padding
12
+
13
+ def initialize_instance
14
+ super
15
+ @enable_padding = true
16
+ end
17
+
18
+ private
19
+
20
+ # Determines the correct length for the padding in front of
21
+ # trans_parameters. It should always force a 4-byte alignment.
22
+ def pad1_length
23
+ if enable_padding
24
+ offset = if respond_to?(:name)
25
+ (name.abs_offset + 1) % 4
26
+ else
27
+ (byte_count.abs_offset + 2) % 4
28
+ end
29
+ (4 - offset) % 4
30
+ else
31
+ 0
32
+ end
33
+ end
34
+
35
+ # Determines the correct length for the padding in front of
36
+ # trans_data. It should always force a 4-byte alignment.
37
+ def pad2_length
38
+ if enable_padding
39
+ offset = (trans_parameters.abs_offset + trans_parameters.length) % 4
40
+ (4 - offset) % 4
41
+ else
42
+ 0
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,24 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans
5
+ # This class represents an SMB1 Trans PeekNamedPipe Request Packet as defined in
6
+ # [2.2.5.5.1 Request](https://msdn.microsoft.com/en-us/library/ee442106.aspx)
7
+ class PeekNmpipeRequest < RubySMB::SMB1::Packet::Trans::Request
8
+
9
+ def fid=(file_id)
10
+ parameter_block.setup = [RubySMB::SMB1::Packet::Trans::Subcommands::PEEK_NMPIPE, file_id]
11
+ end
12
+
13
+ def initialize_instance
14
+ super
15
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION
16
+ data_block.name = "\\PIPE\\"
17
+ parameter_block.setup << RubySMB::SMB1::Packet::Trans::Subcommands::PEEK_NMPIPE
18
+ parameter_block.setup_count = 2
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,59 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans
5
+ # This class represents an SMB1 Trans PeekNamedPipe Response Packet as defined in
6
+ # [2.2.5.5.2 Response](https://msdn.microsoft.com/en-us/library/ee441883.aspx)
7
+ class PeekNmpipeResponse < RubySMB::GenericPacket
8
+ class ParameterBlock < RubySMB::SMB1::Packet::Trans::Response::ParameterBlock
9
+ end
10
+
11
+ # The Trans Parameter Block for this particular Subcommand
12
+ class TransParameters < BinData::Record
13
+ endian :little
14
+
15
+ uint16 :read_data_available, label: 'Read bytes available'
16
+ uint16 :message_bytes_length, label: 'Byte length of available message'
17
+ uint16 :pipe_state, label: 'Named pipe state'
18
+
19
+ # Returns the length of the TransParameters struct
20
+ # in number of bytes
21
+ def length
22
+ do_num_bytes
23
+ end
24
+ end
25
+
26
+ class TransData < BinData::Record
27
+ string :read_data, label: 'Readable data', length: -> { parent.parameter_block.total_data_count }
28
+
29
+ # Returns the length of the TransData struct
30
+ # in number of bytes
31
+ def length
32
+ do_num_bytes
33
+ end
34
+ end
35
+
36
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
37
+ class DataBlock < RubySMB::SMB1::Packet::Trans::DataBlock
38
+ string :pad1, length: -> { pad1_length }
39
+ trans_parameters :trans_parameters, label: 'Trans Parameters'
40
+ # dont understand the padding on this one...
41
+ string :pad2, length: -> { parent.parameter_block.data_offset - parent.parameter_block.parameter_offset - parent.parameter_block.parameter_count }
42
+ trans_data :trans_data, label: 'Trans Data'
43
+ end
44
+
45
+ smb_header :smb_header
46
+ parameter_block :parameter_block
47
+ data_block :data_block
48
+
49
+ def initialize_instance
50
+ super
51
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION
52
+ smb_header.flags.reply = 1
53
+ parameter_block.setup << RubySMB::SMB1::Packet::Trans::Subcommands::PEEK_NMPIPE
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,50 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans
5
+ # A SMB1 SMB_COM_TRANSACTION Request Packet as defined in
6
+ # [2.2.4.33.1 Request](https://msdn.microsoft.com/en-us/library/ee441730.aspx)
7
+ class Request < RubySMB::GenericPacket
8
+ # A SMB1 Parameter Block
9
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
10
+ uint16 :total_parameter_count, label: 'Total Parameter Count(bytes)'
11
+ uint16 :total_data_count, label: 'Total Data Count(bytes)'
12
+ uint16 :max_parameter_count, label: 'Max Parameter Count(bytes)'
13
+ uint16 :max_data_count, label: 'Max Data Count(bytes)'
14
+ uint8 :max_setup_count, label: 'Max Setup Count'
15
+ uint8 :reserved, label: 'Reserved Space', initial_value: 0x00
16
+ trans_flags :flags
17
+ uint32 :timeout, label: 'Timeout', initial_value: 0x00000000
18
+ uint16 :reserved2, label: 'Reserved Space', initial_value: 0x00
19
+ uint16 :parameter_count, label: 'Parameter Count(bytes)', initial_value: -> { parent.data_block.trans_parameters.length }
20
+ uint16 :parameter_offset, label: 'Parameter Offset', initial_value: -> { parent.data_block.trans_parameters.abs_offset }
21
+ uint16 :data_count, label: 'Data Count(bytes)', initial_value: -> { parent.data_block.trans_data.length }
22
+ uint16 :data_offset, label: 'Data Offset', initial_value: -> { parent.data_block.trans_data.abs_offset }
23
+ uint8 :setup_count, label: 'Setup Count', initial_value: -> { setup.length }
24
+ uint8 :reserved3, label: 'Reserved Space', initial_value: 0x00
25
+
26
+ array :setup, type: :uint16, initial_length: 0
27
+ end
28
+
29
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
30
+ class DataBlock < RubySMB::SMB1::Packet::Trans::DataBlock
31
+ stringz :name, label: 'Name', initial_value: ""
32
+ string :pad1, length: -> { pad1_length }
33
+ string :trans_parameters, label: 'Trans Parameters'
34
+ string :pad2, length: -> { pad2_length }
35
+ string :trans_data, label: 'Trans Data'
36
+ end
37
+
38
+ smb_header :smb_header
39
+ parameter_block :parameter_block
40
+ data_block :data_block
41
+
42
+ def initialize_instance
43
+ super
44
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,46 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans
5
+ # A SMB1 SMB_COM_TRANSACTION Response Packet as defined in
6
+ # [2.2.4.33.2 Response](https://msdn.microsoft.com/en-us/library/ee442061.aspx)
7
+ class Response < RubySMB::GenericPacket
8
+ # A SMB1 Parameter Block
9
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
10
+ uint16 :total_parameter_count, label: 'Total Parameter Count(bytes)'
11
+ uint16 :total_data_count, label: 'Total Data Count(bytes)'
12
+ uint16 :reserved, label: 'Reserved Space', initial_value: 0x00
13
+ uint16 :parameter_count, label: 'Parameter Count(bytes)', initial_value: -> { parent.data_block.trans_parameters.length }
14
+ uint16 :parameter_offset, label: 'Parameter Offset', initial_value: -> { parent.data_block.trans_parameters.abs_offset }
15
+ uint16 :parameter_displacement, label: 'Parameter Displacement'
16
+ uint16 :data_count, label: 'Data Count(bytes)', initial_value: -> { parent.data_block.trans_data.length }
17
+ uint16 :data_offset, label: 'Data Offset', initial_value: -> { parent.data_block.trans_data.abs_offset }
18
+ uint16 :data_displacement, label: 'Data Displacement'
19
+ uint8 :setup_count, label: 'Setup Count', initial_value: -> { setup.length }
20
+ uint8 :reserved2, label: 'Reserved Space', initial_value: 0x00
21
+
22
+ array :setup, type: :uint16, initial_length: 0
23
+ end
24
+
25
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
26
+ class DataBlock < RubySMB::SMB1::Packet::Trans::DataBlock
27
+ string :pad1, length: -> { pad1_length }
28
+ string :trans_parameters, label: 'Trans Parameters'
29
+ string :pad2, length: -> { pad2_length }
30
+ string :trans_data, label: 'Trans Data'
31
+ end
32
+
33
+ smb_header :smb_header
34
+ parameter_block :parameter_block
35
+ data_block :data_block
36
+
37
+ def initialize_instance
38
+ super
39
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION
40
+ smb_header.flags.reply = 1
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end