ruby_smb 3.0.6 → 3.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/examples/file_server.rb +8 -1
- data/examples/virtual_file_server.rb +143 -0
- data/lib/ruby_smb/client/encryption.rb +16 -4
- data/lib/ruby_smb/client/negotiation.rb +10 -8
- data/lib/ruby_smb/fscc/file_information/file_access_information.rb +15 -0
- data/lib/ruby_smb/fscc/file_information/file_alignment_information.rb +45 -0
- data/lib/ruby_smb/fscc/file_information/file_all_information.rb +23 -0
- data/lib/ruby_smb/fscc/file_information/file_basic_information.rb +20 -0
- data/lib/ruby_smb/fscc/file_information/file_both_directory_information.rb +3 -3
- data/lib/ruby_smb/fscc/file_information/file_directory_information.rb +3 -3
- data/lib/ruby_smb/fscc/file_information/file_ea_information.rb +1 -0
- data/lib/ruby_smb/fscc/file_information/file_full_directory_information.rb +3 -3
- data/lib/ruby_smb/fscc/file_information/file_id_both_directory_information.rb +3 -3
- data/lib/ruby_smb/fscc/file_information/file_id_full_directory_information.rb +3 -3
- data/lib/ruby_smb/fscc/file_information/file_internal_information.rb +15 -0
- data/lib/ruby_smb/fscc/file_information/file_mode_information.rb +29 -0
- data/lib/ruby_smb/fscc/file_information/file_name_information.rb +16 -0
- data/lib/ruby_smb/fscc/file_information/file_names_information.rb +1 -1
- data/lib/ruby_smb/fscc/file_information/file_normalized_name_information.rb +16 -0
- data/lib/ruby_smb/fscc/file_information/file_position_information.rb +15 -0
- data/lib/ruby_smb/fscc/file_information/file_rename_information.rb +1 -1
- data/lib/ruby_smb/fscc/file_information/file_standard_information.rb +20 -0
- data/lib/ruby_smb/fscc/file_information/file_stream_information.rb +3 -0
- data/lib/ruby_smb/fscc/file_information.rb +43 -6
- data/lib/ruby_smb/fscc/file_system_information/file_fs_attribute_information.rb +1 -0
- data/lib/ruby_smb/fscc/file_system_information/file_fs_volume_information.rb +1 -0
- data/lib/ruby_smb/fscc/file_system_information.rb +4 -0
- data/lib/ruby_smb/gss/provider/ntlm.rb +20 -3
- data/lib/ruby_smb/gss/provider.rb +10 -1
- data/lib/ruby_smb/server/server_client/encryption.rb +66 -0
- data/lib/ruby_smb/server/server_client/negotiation.rb +14 -3
- data/lib/ruby_smb/server/server_client/session_setup.rb +21 -4
- data/lib/ruby_smb/server/server_client/share_io.rb +17 -0
- data/lib/ruby_smb/server/server_client/tree_connect.rb +40 -3
- data/lib/ruby_smb/server/server_client.rb +156 -38
- data/lib/ruby_smb/server/session.rb +5 -1
- data/lib/ruby_smb/server/share/provider/disk/file_system.rb +28 -0
- data/lib/ruby_smb/server/share/provider/disk/processor/close.rb +46 -0
- data/lib/ruby_smb/server/share/provider/disk/processor/create.rb +143 -0
- data/lib/ruby_smb/server/share/provider/disk/processor/query.rb +359 -0
- data/lib/ruby_smb/server/share/provider/disk/processor/read.rb +70 -0
- data/lib/ruby_smb/server/share/provider/disk/processor.rb +223 -0
- data/lib/ruby_smb/server/share/provider/disk.rb +12 -418
- data/lib/ruby_smb/server/share/provider/pipe.rb +2 -2
- data/lib/ruby_smb/server/share/provider/processor.rb +16 -0
- data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_file.rb +85 -0
- data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_pathname.rb +196 -0
- data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_stat.rb +175 -0
- data/lib/ruby_smb/server/share/provider/virtual_disk.rb +116 -0
- data/lib/ruby_smb/server/share/provider.rb +1 -0
- data/lib/ruby_smb/server.rb +13 -3
- data/lib/ruby_smb/signing.rb +18 -4
- data/lib/ruby_smb/smb1/commands.rb +1 -0
- data/lib/ruby_smb/smb1/packet/nt_create_andx_request.rb +11 -1
- data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +1 -1
- data/lib/ruby_smb/smb1/packet/read_andx_response.rb +5 -4
- data/lib/ruby_smb/smb1/packet/session_setup_request.rb +12 -4
- data/lib/ruby_smb/smb1/packet/trans2/data_block.rb +9 -1
- data/lib/ruby_smb/smb1/packet/trans2/find_first2_request.rb +52 -51
- data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +37 -37
- data/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_both_directory_info.rb +48 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_information_level.rb +28 -15
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_request.rb +51 -51
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +36 -36
- data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +40 -39
- data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +40 -40
- data/lib/ruby_smb/smb1/packet/trans2/query_file_information_request.rb +60 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_file_information_response.rb +59 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_level/query_fs_attribute_info.rb +31 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_level.rb +40 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_request.rb +46 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_response.rb +59 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_information_level/query_file_basic_info.rb +23 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_information_level/query_file_standard_info.rb +22 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_information_level.rb +62 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_path_information_request.rb +65 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_path_information_response.rb +59 -0
- data/lib/ruby_smb/smb1/packet/trans2/request.rb +24 -8
- data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +4 -4
- data/lib/ruby_smb/smb1/packet/trans2/response.rb +29 -20
- data/lib/ruby_smb/smb1/packet/trans2/set_file_information_request.rb +42 -42
- data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +23 -23
- data/lib/ruby_smb/smb1/packet/trans2/subcommands.rb +23 -5
- data/lib/ruby_smb/smb1/packet/trans2.rb +4 -0
- data/lib/ruby_smb/smb1/packet/tree_connect_request.rb +4 -1
- data/lib/ruby_smb/smb2/negotiate_context.rb +10 -1
- data/lib/ruby_smb/smb2/packet/transform_header.rb +7 -7
- data/lib/ruby_smb/smb2/tree.rb +1 -0
- data/lib/ruby_smb/smb2.rb +1 -0
- data/lib/ruby_smb/version.rb +1 -1
- data/spec/lib/ruby_smb/client_spec.rb +31 -8
- data/spec/lib/ruby_smb/fscc/file_information/file_access_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_alignment_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_all_information_spec.rb +61 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_basic_information_spec.rb +41 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_both_directory_information_spec.rb +59 -10
- data/spec/lib/ruby_smb/fscc/file_information/file_directory_information_spec.rb +30 -12
- data/spec/lib/ruby_smb/fscc/file_information/file_ea_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_full_directory_information_spec.rb +30 -12
- data/spec/lib/ruby_smb/fscc/file_information/file_id_both_directory_information_spec.rb +63 -10
- data/spec/lib/ruby_smb/fscc/file_information/file_id_full_directory_information_spec.rb +30 -12
- data/spec/lib/ruby_smb/fscc/file_information/file_internal_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_mode_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_name_information_spec.rb +44 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_names_information_spec.rb +30 -12
- data/spec/lib/ruby_smb/fscc/file_information/file_network_open_information_spec.rb +51 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_normalized_name_information_spec.rb +44 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_position_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_rename_information_spec.rb +1 -1
- data/spec/lib/ruby_smb/fscc/file_information/file_standard_information_spec.rb +41 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_stream_information_spec.rb +51 -0
- data/spec/lib/ruby_smb/fscc/file_information_spec.rb +14 -0
- data/spec/lib/ruby_smb/fscc/file_system_information/file_fs_attribute_information_spec.rb +46 -0
- data/spec/lib/ruby_smb/fscc/file_system_information/file_fs_volume_information_spec.rb +51 -0
- data/spec/lib/ruby_smb/fscc/file_system_information_spec.rb +14 -0
- data/spec/lib/ruby_smb/server/server_client_spec.rb +15 -0
- data/spec/lib/ruby_smb/server/share/provider/virtual_disk/virtual_pathname_spec.rb +581 -0
- data/spec/lib/ruby_smb/server/share/provider/virtual_disk/virtual_stat_spec.rb +207 -0
- data/spec/lib/ruby_smb/server/share/provider/virtual_disk_spec.rb +122 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +36 -2
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +35 -1
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_file_information_request_spec.rb +74 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_file_information_response_spec.rb +96 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_fs_information_request_spec.rb +62 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_fs_information_response_spec.rb +88 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_path_information_request_spec.rb +79 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_path_information_response_spec.rb +96 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +2 -2
- data/spec/lib/ruby_smb/smb1/packet/trans2/response_spec.rb +3 -3
- data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_request_spec.rb +3 -2
- data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +7 -2
- data/spec/lib/ruby_smb/smb1/tree_spec.rb +3 -3
- data/spec/lib/ruby_smb/smb2/packet/transform_header_spec.rb +2 -2
- data.tar.gz.sig +0 -0
- metadata +88 -2
- metadata.gz.sig +0 -0
@@ -2,70 +2,71 @@ module RubySMB
|
|
2
2
|
module SMB1
|
3
3
|
module Packet
|
4
4
|
module Trans2
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
COMMAND = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
9
|
-
|
10
|
-
class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Request::ParameterBlock
|
11
|
-
end
|
5
|
+
# The Trans2 Parameter Block for this particular Subcommand
|
6
|
+
class FindFirst2RequestTrans2Parameters < BinData::Record
|
7
|
+
endian :little
|
12
8
|
|
13
|
-
|
14
|
-
|
15
|
-
endian :little
|
16
|
-
smb_file_attributes :search_attributes, label: 'File Attributes'
|
17
|
-
uint16 :search_count, label: 'Search Count'
|
9
|
+
smb_file_attributes :search_attributes, label: 'File Attributes'
|
10
|
+
uint16 :search_count, label: 'Search Count'
|
18
11
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
12
|
+
struct :flags do
|
13
|
+
bit3 :reserved, label: 'Reserved Space'
|
14
|
+
bit1 :backup, label: 'With Backup Intent'
|
15
|
+
bit1 :continue, label: 'Continue From Last'
|
16
|
+
bit1 :resume_keys, label: 'Return Resume Keys'
|
17
|
+
bit1 :close_eos, label: 'Close at End of Search'
|
18
|
+
bit1 :close, label: 'Close Search After This Request'
|
26
19
|
|
27
|
-
|
28
|
-
|
20
|
+
bit8 :reserved2, label: 'Reserved Space'
|
21
|
+
end
|
29
22
|
|
30
|
-
|
31
|
-
|
23
|
+
uint16 :information_level, label: 'Information Level'
|
24
|
+
uint32 :storage_type, label: 'Search Storage type'
|
32
25
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
26
|
+
choice :filename, :copy_on_change => true, selection: -> { self.smb_header.flags2.unicode } do
|
27
|
+
stringz16 1, label: 'FileName'
|
28
|
+
stringz 0, label: 'FileName'
|
29
|
+
end
|
37
30
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
31
|
+
# Returns the length of the Trans2Parameters struct
|
32
|
+
# in number of bytes
|
33
|
+
def length
|
34
|
+
do_num_bytes
|
43
35
|
end
|
36
|
+
end
|
44
37
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
38
|
+
# The Trans2 Data Block for this particular Subcommand
|
39
|
+
class FindFirst2RequestTrans2Data < BinData::Record
|
40
|
+
smb_gea_list :extended_attribute_list, label: 'Get Extended Attribute List',
|
41
|
+
onlyif: -> { parent.trans2_parameters.information_level == FindInformationLevel::SMB_INFO_QUERY_EAS_FROM_LIST}
|
49
42
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
43
|
+
# Returns the length of the Trans2Data struct
|
44
|
+
# in number of bytes
|
45
|
+
def length
|
46
|
+
do_num_bytes
|
55
47
|
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# The {RubySMB::SMB1::DataBlock} specific to this packet type.
|
51
|
+
class FindFirst2RequestDataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
52
|
+
uint8 :name, label: 'Name', initial_value: 0x00
|
53
|
+
string :pad1, length: -> { pad1_length }
|
54
|
+
find_first2_request_trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
|
55
|
+
string :pad2, length: -> { pad2_length }
|
56
|
+
find_first2_request_trans2_data :trans2_data, label: 'Trans2 Data'
|
57
|
+
end
|
56
58
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
trans2_data :trans2_data, label: 'Trans2 Data'
|
59
|
+
# A Trans2 FIND_FIRST2 Request Packet as defined in
|
60
|
+
# [2.2.6.2.1](https://msdn.microsoft.com/en-us/library/ee441987.aspx)
|
61
|
+
class FindFirst2Request < RubySMB::GenericPacket
|
62
|
+
COMMAND = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
63
|
+
|
64
|
+
class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Request::ParameterBlock
|
64
65
|
end
|
65
66
|
|
66
|
-
smb_header
|
67
|
-
parameter_block
|
68
|
-
|
67
|
+
smb_header :smb_header
|
68
|
+
parameter_block :parameter_block
|
69
|
+
find_first2_request_data_block :data_block
|
69
70
|
|
70
71
|
def initialize_instance
|
71
72
|
super
|
@@ -2,53 +2,53 @@ module RubySMB
|
|
2
2
|
module SMB1
|
3
3
|
module Packet
|
4
4
|
module Trans2
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
COMMAND = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
5
|
+
# The Trans2 Parameter Block for this particular Subcommand
|
6
|
+
class FindFirst2ResponseTrans2Parameters < BinData::Record
|
7
|
+
endian :little
|
9
8
|
|
10
|
-
|
11
|
-
|
9
|
+
uint16 :sid, label: 'Search ID'
|
10
|
+
uint16 :search_count, label: 'Search Count'
|
11
|
+
uint16 :eos, label: 'End of Search'
|
12
|
+
uint16 :ea_error_offset, label: 'Offset to EA Error'
|
13
|
+
uint16 :last_name_offset, label: 'Last Name Offset'
|
12
14
|
|
13
|
-
#
|
14
|
-
|
15
|
-
|
15
|
+
# Returns the length of the Trans2Parameters struct
|
16
|
+
# in number of bytes
|
17
|
+
def length
|
18
|
+
do_num_bytes
|
19
|
+
end
|
20
|
+
end
|
16
21
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
uint16 :ea_error_offset, label: 'Offset to EA Error'
|
21
|
-
uint16 :last_name_offset, label: 'Last Name Offset'
|
22
|
+
# The Trans2 Data Block for this particular Subcommand
|
23
|
+
class FindFirst2ResponseTrans2Data < BinData::Record
|
24
|
+
string :buffer, label: 'Results Buffer', read_length: :buffer_read_length
|
22
25
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
26
|
+
# Returns the length of the Trans2Data struct
|
27
|
+
# in number of bytes
|
28
|
+
def length
|
29
|
+
do_num_bytes
|
28
30
|
end
|
31
|
+
end
|
29
32
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
+
# The {RubySMB::SMB1::DataBlock} specific to this packet type.
|
34
|
+
class FindFirst2ResponseDataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
35
|
+
string :pad1, length: -> { pad1_length }
|
36
|
+
find_first2_response_trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
|
37
|
+
string :pad2, length: -> { pad2_length }
|
38
|
+
find_first2_response_trans2_data :trans2_data, label: 'Trans2 Data', length: 0
|
39
|
+
end
|
33
40
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
39
|
-
end
|
41
|
+
# This class represents an SMB1 Trans2 FIND_FIRST2 Response Packet as defined in
|
42
|
+
# [2.2.6.2.2 Response](https://msdn.microsoft.com/en-us/library/ee441704.aspx)
|
43
|
+
class FindFirst2Response < RubySMB::GenericPacket
|
44
|
+
COMMAND = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
40
45
|
|
41
|
-
|
42
|
-
class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
43
|
-
string :pad1, length: -> { pad1_length }
|
44
|
-
trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
|
45
|
-
string :pad2, length: -> { pad2_length }
|
46
|
-
trans2_data :trans2_data, label: 'Trans2 Data', length: 0
|
46
|
+
class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Response::ParameterBlock
|
47
47
|
end
|
48
48
|
|
49
|
-
smb_header
|
50
|
-
parameter_block
|
51
|
-
|
49
|
+
smb_header :smb_header
|
50
|
+
parameter_block :parameter_block
|
51
|
+
find_first2_response_data_block :data_block
|
52
52
|
|
53
53
|
def initialize_instance
|
54
54
|
super
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module SMB1
|
3
|
+
module Packet
|
4
|
+
module Trans2
|
5
|
+
module FindInformationLevel
|
6
|
+
# The SMB_FIND_FILE_BOTH_DIRECTORY_INFO class as defined in
|
7
|
+
# [2.2.8.1.7 SMB_FIND_FILE_BOTH_DIRECTORY_INFO](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/2aa849f4-1bc0-42bf-9c8f-d09f11fccc4c)
|
8
|
+
class FindFileBothDirectoryInfo < BinData::Record
|
9
|
+
CLASS_LEVEL = FindInformationLevel::SMB_FIND_FILE_BOTH_DIRECTORY_INFO
|
10
|
+
|
11
|
+
endian :little
|
12
|
+
|
13
|
+
uint32 :next_offset, label: 'Next Entry Offset'
|
14
|
+
uint32 :file_index, label: 'File Index'
|
15
|
+
file_time :create_time, label: 'Create Time'
|
16
|
+
file_time :last_access, label: 'Last Accessed Time'
|
17
|
+
file_time :last_write, label: 'Last Write Time'
|
18
|
+
file_time :last_change, label: 'Last Attribute Change Time'
|
19
|
+
uint64 :end_of_file, label: 'End of File'
|
20
|
+
uint64 :allocation_size, label: 'Allocated Size'
|
21
|
+
smb_ext_file_attributes :ext_file_attributes, label: 'Extended File Attributes'
|
22
|
+
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
23
|
+
uint32 :ea_size, label: 'Extended Attributes Size'
|
24
|
+
uint8 :short_name_length, label: 'Short Name Length'
|
25
|
+
uint8 :reserved, label: 'Reserved'
|
26
|
+
string16 :short_name, label: 'Short Name', length: 24 # always 12 wchars / 24 bytes
|
27
|
+
|
28
|
+
choice :file_name, :copy_on_change => true, selection: -> { unicode } do
|
29
|
+
string16 true, label: 'File Name', read_length: -> { file_name_length }
|
30
|
+
stringz false, label: 'File Name', read_length: -> { file_name_length }
|
31
|
+
end
|
32
|
+
|
33
|
+
# Set unicode encoding for filename
|
34
|
+
# @!attribute [rw] unicode
|
35
|
+
# @return [Boolean]
|
36
|
+
attr_accessor :unicode
|
37
|
+
|
38
|
+
def initialize_instance
|
39
|
+
super
|
40
|
+
@unicode = false
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -7,24 +7,37 @@ module RubySMB
|
|
7
7
|
# of information that a server MUST respond with for each file matching the
|
8
8
|
# request's search criteria.
|
9
9
|
module FindInformationLevel
|
10
|
-
#
|
11
|
-
|
12
|
-
#
|
13
|
-
SMB_INFO_QUERY_EA_SIZE = 0x0002
|
14
|
-
# Return the SMB_INFO_QUERY_EA_SIZE data along with a specific list of a file's EAs. The requested EAs are provided in the Trans2_Data block of the request.
|
15
|
-
SMB_INFO_QUERY_EAS_FROM_LIST = 0x0003
|
16
|
-
# Return 64-bit format versions of: creation, access, last write, and last attribute change timestamps; size. In addition, return extended file attributes and file name.
|
17
|
-
SMB_FIND_FILE_DIRECTORY_INFO = 0x0101
|
18
|
-
# Returns the SMB_FIND_FILE_DIRECTORY_INFO data along with the size of a file's EAs.
|
19
|
-
SMB_FIND_FILE_FULL_DIRECTORY_INFO = 0x0102
|
20
|
-
# Returns the name(s) of the file(s).
|
21
|
-
SMB_FIND_FILE_NAMES_INFO = 0x0103
|
22
|
-
# Returns a combination of the data from SMB_FIND_FILE_FULL_DIRECTORY_INFO and SMB_FIND_FILE_NAMES_INFO.
|
23
|
-
SMB_FIND_FILE_BOTH_DIRECTORY_INFO = 0x0104
|
10
|
+
# Constants defined in
|
11
|
+
# [2.2.2.3.1 FIND Information Level Codes](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/f5dcd594-1c46-4bc6-963f-581a4c78ea99)
|
12
|
+
# [dialect] description
|
24
13
|
|
14
|
+
# [LANMAN2.0] Return creation, access, and last write timestamps, size and file attributes along with the file name.
|
15
|
+
SMB_INFO_STANDARD = 0x0001 # 1
|
25
16
|
|
26
|
-
|
17
|
+
# [LANMAN2.0] Return the SMB_INFO_STANDARD data along with the size of a file's extended attributes (EAs).
|
18
|
+
SMB_INFO_QUERY_EA_SIZE = 0x0002 # 2
|
19
|
+
|
20
|
+
# [LANMAN2.0] Return the SMB_INFO_QUERY_EA_SIZE data along with a specific list of a file's EAs. The requested EAs are provided in the Trans2_Data block of the request.
|
21
|
+
SMB_INFO_QUERY_EAS_FROM_LIST = 0x0003 # 3
|
22
|
+
|
23
|
+
# [NT LANMAN] Return 64-bit format versions of: creation, access, last write, and last attribute change timestamps; size. In addition, return extended file attributes and file name.
|
24
|
+
SMB_FIND_FILE_DIRECTORY_INFO = 0x0101 # 257
|
25
|
+
|
26
|
+
# [NT LANMAN] Returns the SMB_FIND_FILE_DIRECTORY_INFO data along with the size of a file's EAs.
|
27
|
+
SMB_FIND_FILE_FULL_DIRECTORY_INFO = 0x0102 # 258
|
27
28
|
|
29
|
+
# [NT LANMAN] Returns the name(s) of the file(s).
|
30
|
+
SMB_FIND_FILE_NAMES_INFO = 0x0103 # 259
|
31
|
+
|
32
|
+
# [NT LANMAN] Returns a combination of the data from SMB_FIND_FILE_FULL_DIRECTORY_INFO and SMB_FIND_FILE_NAMES_INFO.
|
33
|
+
SMB_FIND_FILE_BOTH_DIRECTORY_INFO = 0x0104 # 260
|
34
|
+
|
35
|
+
def self.name(value)
|
36
|
+
constants.select { |c| c.upcase == c }.find { |c| const_get(c) == value }
|
37
|
+
end
|
38
|
+
|
39
|
+
require 'ruby_smb/smb1/packet/trans2/find_information_level/find_file_both_directory_info'
|
40
|
+
require 'ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info'
|
28
41
|
end
|
29
42
|
end
|
30
43
|
end
|
@@ -2,70 +2,70 @@ module RubySMB
|
|
2
2
|
module SMB1
|
3
3
|
module Packet
|
4
4
|
module Trans2
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
COMMAND = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
5
|
+
# The Trans2 Parameter Block for this particular Subcommand
|
6
|
+
class FindNext2RequestTrans2Parameters < BinData::Record
|
7
|
+
endian :little
|
9
8
|
|
10
|
-
|
11
|
-
|
9
|
+
uint16 :sid, label: 'Search ID'
|
10
|
+
uint16 :search_count, label: 'Search Count'
|
11
|
+
uint16 :information_level, label: 'Information Level'
|
12
|
+
uint32 :resume_key, label: 'Resume Key'
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
struct :flags do
|
15
|
+
bit3 :reserved, label: 'Reserved Space'
|
16
|
+
bit1 :backup, label: 'With Backup Intent'
|
17
|
+
bit1 :continue, label: 'Continue From Last'
|
18
|
+
bit1 :resume_keys, label: 'Return Resume Keys'
|
19
|
+
bit1 :close_eos, label: 'Close at End of Search'
|
20
|
+
bit1 :close, label: 'Close Search After This Request'
|
16
21
|
|
17
|
-
|
18
|
-
|
19
|
-
uint16 :information_level, label: 'Information Level'
|
20
|
-
uint32 :resume_key, label: 'Resume Key'
|
22
|
+
bit8 :reserved2, label: 'Reserved Space'
|
23
|
+
end
|
21
24
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
bit1 :resume_keys, label: 'Return Resume Keys'
|
27
|
-
bit1 :close_eos, label: 'Close at End of Search'
|
28
|
-
bit1 :close, label: 'Close Search After This Request'
|
25
|
+
choice :filename, :copy_on_change => true, selection: -> { @obj.parent.parent.parent.smb_header.flags2.unicode } do
|
26
|
+
stringz16 1, label: 'FileName'
|
27
|
+
stringz 0, label: 'FileName'
|
28
|
+
end
|
29
29
|
|
30
|
-
|
31
|
-
|
30
|
+
# Returns the length of the Trans2Parameters struct
|
31
|
+
# in number of bytes
|
32
|
+
def length
|
33
|
+
do_num_bytes
|
34
|
+
end
|
35
|
+
end
|
32
36
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
+
# The Trans2 Data Block for this particular Subcommand
|
38
|
+
class FindNext2RequestTrans2Data < BinData::Record
|
39
|
+
smb_gea_list :extended_attribute_list, label: 'Get Extended Attribute List',
|
40
|
+
onlyif: -> { parent.trans2_parameters.information_level == FindInformationLevel::SMB_INFO_QUERY_EAS_FROM_LIST}
|
37
41
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
42
|
+
# Returns the length of the Trans2Data struct
|
43
|
+
# in number of bytes
|
44
|
+
def length
|
45
|
+
do_num_bytes
|
43
46
|
end
|
47
|
+
end
|
44
48
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
+
# The {RubySMB::SMB1::DataBlock} specific to this packet type.
|
50
|
+
class FindNext2RequestDataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
51
|
+
uint8 :name, label: 'Name', initial_value: 0x00
|
52
|
+
string :pad1, length: -> { pad1_length }
|
53
|
+
find_next2_request_trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
|
54
|
+
string :pad2, length: -> { pad2_length }
|
55
|
+
find_next2_request_trans2_data :trans2_data, label: 'Trans2 Data'
|
56
|
+
end
|
49
57
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|
58
|
+
# A Trans2 FIND_NEXT2 Request Packet as defined in
|
59
|
+
# [2.2.6.3.1 Request](https://msdn.microsoft.com/en-us/library/ee441844.aspx)
|
60
|
+
class FindNext2Request < RubySMB::GenericPacket
|
61
|
+
COMMAND = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
56
62
|
|
57
|
-
|
58
|
-
class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
59
|
-
uint8 :name, label: 'Name', initial_value: 0x00
|
60
|
-
string :pad1, length: -> { pad1_length }
|
61
|
-
trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
|
62
|
-
string :pad2, length: -> { pad2_length }
|
63
|
-
trans2_data :trans2_data, label: 'Trans2 Data'
|
63
|
+
class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Request::ParameterBlock
|
64
64
|
end
|
65
65
|
|
66
|
-
smb_header
|
67
|
-
parameter_block
|
68
|
-
|
66
|
+
smb_header :smb_header
|
67
|
+
parameter_block :parameter_block
|
68
|
+
find_next2_request_data_block :data_block
|
69
69
|
|
70
70
|
def initialize_instance
|
71
71
|
super
|
@@ -2,52 +2,52 @@ module RubySMB
|
|
2
2
|
module SMB1
|
3
3
|
module Packet
|
4
4
|
module Trans2
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
COMMAND = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
5
|
+
# The Trans2 Parameter Block for this particular Subcommand
|
6
|
+
class FindNext2ResponseTrans2Parameters < BinData::Record
|
7
|
+
endian :little
|
9
8
|
|
10
|
-
|
11
|
-
|
9
|
+
uint16 :search_count, label: 'Search Count'
|
10
|
+
uint16 :eos, label: 'End of Search'
|
11
|
+
uint16 :ea_error_offset, label: 'Offset to EA Error'
|
12
|
+
uint16 :last_name_offset, label: 'Last Name Offset'
|
12
13
|
|
13
|
-
#
|
14
|
-
|
15
|
-
|
14
|
+
# Returns the length of the Trans2Parameters struct
|
15
|
+
# in number of bytes
|
16
|
+
def length
|
17
|
+
do_num_bytes
|
18
|
+
end
|
19
|
+
end
|
16
20
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
uint16 :last_name_offset, label: 'Last Name Offset'
|
21
|
+
# The Trans2 Data Block for this particular Subcommand
|
22
|
+
class FindNext2ResponseTrans2Data < BinData::Record
|
23
|
+
string :buffer, label: 'Results Buffer', read_length: :buffer_read_length
|
21
24
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
25
|
+
# Returns the length of the Trans2Data struct
|
26
|
+
# in number of bytes
|
27
|
+
def length
|
28
|
+
do_num_bytes
|
27
29
|
end
|
30
|
+
end
|
28
31
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
+
# The {RubySMB::SMB1::DataBlock} specific to this packet type.
|
33
|
+
class FindNext2ResponseDataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
34
|
+
string :pad1, length: -> { pad1_length }
|
35
|
+
find_next2_response_trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
|
36
|
+
string :pad2, length: -> { pad2_length }
|
37
|
+
find_next2_response_trans2_data :trans2_data, label: 'Trans2 Data', length: 0
|
38
|
+
end
|
32
39
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
40
|
+
# This class represents an SMB1 Trans2 FIND_NEXT2 Response Packet as defined in
|
41
|
+
# [2.2.6.3.2 Response](https://msdn.microsoft.com/en-us/library/ee441871.aspx)
|
42
|
+
class FindNext2Response < RubySMB::GenericPacket
|
43
|
+
COMMAND = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
39
44
|
|
40
|
-
|
41
|
-
class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
42
|
-
string :pad1, length: -> { pad1_length }
|
43
|
-
trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
|
44
|
-
string :pad2, length: -> { pad2_length }
|
45
|
-
trans2_data :trans2_data, label: 'Trans2 Data', length: 0
|
45
|
+
class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Response::ParameterBlock
|
46
46
|
end
|
47
47
|
|
48
|
-
smb_header
|
49
|
-
parameter_block
|
50
|
-
|
48
|
+
smb_header :smb_header
|
49
|
+
parameter_block :parameter_block
|
50
|
+
find_next2_response_data_block :data_block
|
51
51
|
|
52
52
|
def initialize_instance
|
53
53
|
super
|
@@ -2,53 +2,54 @@ module RubySMB
|
|
2
2
|
module SMB1
|
3
3
|
module Packet
|
4
4
|
module Trans2
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
COMMAND = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
5
|
+
# The Trans2 Parameter Block for this particular Subcommand
|
6
|
+
class Open2RequestTrans2Parameters < BinData::Record
|
7
|
+
endian :little
|
9
8
|
|
10
|
-
|
9
|
+
open2_flags :flags, label: 'Flags'
|
10
|
+
open2_access_mode :access_mode, label: 'AccessMode'
|
11
|
+
uint16 :reserved, label: 'Reserved Space'
|
12
|
+
smb_file_attributes :file_attributes, label: 'File Attributes'
|
13
|
+
utime :creation_time, label: 'Creation Time'
|
14
|
+
open2_open_mode :open_mode, label: 'Open Mode'
|
15
|
+
uint32 :allocation_size, label: 'Allocation Size'
|
16
|
+
array :reserved2, initial_length: 5 do
|
17
|
+
uint16 initial_value: 0x0000
|
11
18
|
end
|
19
|
+
stringz :filename, label: 'Filename'
|
12
20
|
|
13
|
-
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
open2_access_mode :access_mode, label: 'AccessMode'
|
18
|
-
uint16 :reserved, label: 'Reserved Space'
|
19
|
-
smb_file_attributes :file_attributes, label: 'File Attributes'
|
20
|
-
utime :creation_time, label: 'Creation Time'
|
21
|
-
open2_open_mode :open_mode, label: 'Open Mode'
|
22
|
-
uint32 :allocation_size, label: 'Allocation Size'
|
23
|
-
array :reserved2, initial_length: 5 do
|
24
|
-
uint16 initial_value: 0x0000
|
25
|
-
end
|
26
|
-
stringz :filename, label: 'Filename'
|
27
|
-
|
28
|
-
# Returns the length of the Trans2Parameters struct
|
29
|
-
# in number of bytes
|
30
|
-
def length
|
31
|
-
do_num_bytes
|
32
|
-
end
|
21
|
+
# Returns the length of the Trans2Parameters struct
|
22
|
+
# in number of bytes
|
23
|
+
def length
|
24
|
+
do_num_bytes
|
33
25
|
end
|
26
|
+
end
|
34
27
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
28
|
+
# The Trans2 Data Block for this particular Subcommand
|
29
|
+
class Open2RequestTrans2Data < BinData::Record
|
30
|
+
smb_fea_list :extended_attribute_list, label: 'Extended Attribute List'
|
31
|
+
end
|
39
32
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
33
|
+
# The {RubySMB::SMB1::DataBlock} specific to this packet type.
|
34
|
+
class Open2RequestDataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
35
|
+
uint8 :name, label: 'Name', initial_value: 0x00
|
36
|
+
string :pad1, length: -> { pad1_length }
|
37
|
+
open2_request_trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
|
38
|
+
string :pad2, length: -> { pad2_length }
|
39
|
+
open2_request_trans2_data :trans2_data, label: 'Trans2 Data'
|
40
|
+
end
|
41
|
+
|
42
|
+
# A Trans2 OPEN2 Request Packet as defined in
|
43
|
+
# [2.2.6.1.1 Request](https://msdn.microsoft.com/en-us/library/ee441733.aspx)
|
44
|
+
class Open2Request < RubySMB::GenericPacket
|
45
|
+
COMMAND = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
46
|
+
|
47
|
+
class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Request::ParameterBlock
|
47
48
|
end
|
48
49
|
|
49
|
-
smb_header
|
50
|
-
parameter_block
|
51
|
-
|
50
|
+
smb_header :smb_header
|
51
|
+
parameter_block :parameter_block
|
52
|
+
open2_request_data_block :data_block
|
52
53
|
|
53
54
|
def initialize_instance
|
54
55
|
super
|