ruby_smb 3.1.1 → 3.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -2
  3. data/examples/file_server.rb +6 -61
  4. data/examples/virtual_file_server.rb +91 -0
  5. data/lib/ruby_smb/client/authentication.rb +12 -2
  6. data/lib/ruby_smb/client/negotiation.rb +2 -0
  7. data/lib/ruby_smb/client.rb +8 -2
  8. data/lib/ruby_smb/error.rb +4 -0
  9. data/lib/ruby_smb/fscc/file_information/file_access_information.rb +15 -0
  10. data/lib/ruby_smb/fscc/file_information/file_alignment_information.rb +45 -0
  11. data/lib/ruby_smb/fscc/file_information/file_all_information.rb +23 -0
  12. data/lib/ruby_smb/fscc/file_information/file_basic_information.rb +20 -0
  13. data/lib/ruby_smb/fscc/file_information/file_both_directory_information.rb +3 -3
  14. data/lib/ruby_smb/fscc/file_information/file_directory_information.rb +3 -3
  15. data/lib/ruby_smb/fscc/file_information/file_ea_information.rb +1 -0
  16. data/lib/ruby_smb/fscc/file_information/file_full_directory_information.rb +3 -3
  17. data/lib/ruby_smb/fscc/file_information/file_id_both_directory_information.rb +3 -3
  18. data/lib/ruby_smb/fscc/file_information/file_id_full_directory_information.rb +3 -3
  19. data/lib/ruby_smb/fscc/file_information/file_internal_information.rb +15 -0
  20. data/lib/ruby_smb/fscc/file_information/file_mode_information.rb +29 -0
  21. data/lib/ruby_smb/fscc/file_information/file_name_information.rb +16 -0
  22. data/lib/ruby_smb/fscc/file_information/file_names_information.rb +1 -1
  23. data/lib/ruby_smb/fscc/file_information/file_normalized_name_information.rb +16 -0
  24. data/lib/ruby_smb/fscc/file_information/file_position_information.rb +15 -0
  25. data/lib/ruby_smb/fscc/file_information/file_rename_information.rb +1 -1
  26. data/lib/ruby_smb/fscc/file_information/file_standard_information.rb +20 -0
  27. data/lib/ruby_smb/fscc/file_information/file_stream_information.rb +3 -0
  28. data/lib/ruby_smb/fscc/file_information.rb +41 -8
  29. data/lib/ruby_smb/fscc/file_system_information/file_fs_attribute_information.rb +1 -0
  30. data/lib/ruby_smb/fscc/file_system_information/file_fs_volume_information.rb +1 -0
  31. data/lib/ruby_smb/fscc/file_system_information.rb +4 -0
  32. data/lib/ruby_smb/gss/provider/ntlm.rb +16 -3
  33. data/lib/ruby_smb/gss/provider.rb +10 -1
  34. data/lib/ruby_smb/gss.rb +1 -0
  35. data/lib/ruby_smb/ntlm/client.rb +74 -0
  36. data/lib/ruby_smb/ntlm.rb +1 -0
  37. data/lib/ruby_smb/server/cli.rb +121 -0
  38. data/lib/ruby_smb/server/server_client/session_setup.rb +4 -2
  39. data/lib/ruby_smb/server/server_client.rb +9 -1
  40. data/lib/ruby_smb/server/session.rb +5 -1
  41. data/lib/ruby_smb/server/share/provider/disk/processor/close.rb +9 -5
  42. data/lib/ruby_smb/server/share/provider/disk/processor/create.rb +2 -2
  43. data/lib/ruby_smb/server/share/provider/disk/processor/query.rb +2 -2
  44. data/lib/ruby_smb/server/share/provider/disk/processor/read.rb +15 -14
  45. data/lib/ruby_smb/server/share/provider/disk/processor.rb +76 -12
  46. data/lib/ruby_smb/server/share/provider/disk.rb +8 -2
  47. data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_file.rb +85 -0
  48. data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_pathname.rb +196 -0
  49. data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_stat.rb +175 -0
  50. data/lib/ruby_smb/server/share/provider/virtual_disk.rb +116 -0
  51. data/lib/ruby_smb/server/share/provider.rb +1 -0
  52. data/lib/ruby_smb/server.rb +14 -3
  53. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +11 -0
  54. data/lib/ruby_smb/smb2/tree.rb +1 -0
  55. data/lib/ruby_smb/version.rb +1 -1
  56. data/spec/lib/ruby_smb/fscc/file_information/file_access_information_spec.rb +21 -0
  57. data/spec/lib/ruby_smb/fscc/file_information/file_alignment_information_spec.rb +21 -0
  58. data/spec/lib/ruby_smb/fscc/file_information/file_all_information_spec.rb +61 -0
  59. data/spec/lib/ruby_smb/fscc/file_information/file_basic_information_spec.rb +41 -0
  60. data/spec/lib/ruby_smb/fscc/file_information/file_both_directory_information_spec.rb +59 -10
  61. data/spec/lib/ruby_smb/fscc/file_information/file_directory_information_spec.rb +30 -12
  62. data/spec/lib/ruby_smb/fscc/file_information/file_ea_information_spec.rb +21 -0
  63. data/spec/lib/ruby_smb/fscc/file_information/file_full_directory_information_spec.rb +30 -12
  64. data/spec/lib/ruby_smb/fscc/file_information/file_id_both_directory_information_spec.rb +63 -10
  65. data/spec/lib/ruby_smb/fscc/file_information/file_id_full_directory_information_spec.rb +30 -12
  66. data/spec/lib/ruby_smb/fscc/file_information/file_internal_information_spec.rb +21 -0
  67. data/spec/lib/ruby_smb/fscc/file_information/file_mode_information_spec.rb +21 -0
  68. data/spec/lib/ruby_smb/fscc/file_information/file_name_information_spec.rb +44 -0
  69. data/spec/lib/ruby_smb/fscc/file_information/file_names_information_spec.rb +30 -12
  70. data/spec/lib/ruby_smb/fscc/file_information/file_network_open_information_spec.rb +51 -0
  71. data/spec/lib/ruby_smb/fscc/file_information/file_normalized_name_information_spec.rb +44 -0
  72. data/spec/lib/ruby_smb/fscc/file_information/file_position_information_spec.rb +21 -0
  73. data/spec/lib/ruby_smb/fscc/file_information/file_rename_information_spec.rb +1 -1
  74. data/spec/lib/ruby_smb/fscc/file_information/file_standard_information_spec.rb +41 -0
  75. data/spec/lib/ruby_smb/fscc/file_information/file_stream_information_spec.rb +51 -0
  76. data/spec/lib/ruby_smb/fscc/file_information_spec.rb +14 -0
  77. data/spec/lib/ruby_smb/fscc/file_system_information/file_fs_attribute_information_spec.rb +46 -0
  78. data/spec/lib/ruby_smb/fscc/file_system_information/file_fs_volume_information_spec.rb +51 -0
  79. data/spec/lib/ruby_smb/fscc/file_system_information_spec.rb +14 -0
  80. data/spec/lib/ruby_smb/ntlm/client/session_spec.rb +114 -0
  81. data/spec/lib/ruby_smb/ntlm/client_spec.rb +36 -0
  82. data/spec/lib/ruby_smb/server/server_client_spec.rb +15 -0
  83. data/spec/lib/ruby_smb/server/share/provider/virtual_disk/virtual_pathname_spec.rb +581 -0
  84. data/spec/lib/ruby_smb/server/share/provider/virtual_disk/virtual_stat_spec.rb +207 -0
  85. data/spec/lib/ruby_smb/server/share/provider/virtual_disk_spec.rb +122 -0
  86. data.tar.gz.sig +0 -0
  87. metadata +63 -2
  88. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5567054608b80da9be641c717d1d8b69e71452fb2fc67c2e390d9a6a34fb19d3
4
- data.tar.gz: 0b439033b20bd578414e51d56d98ee4ccc4d44c60e6248bf0b8ad37a33b0fd6d
3
+ metadata.gz: 587f03eec26c36a6ca67ffde30bb05881a456609dff32873b912e7763d266f25
4
+ data.tar.gz: 18c3b50b89657fe874d0a13904dad2b36c01c49089f01b5a3821d1733eb07c61
5
5
  SHA512:
6
- metadata.gz: 19ad76e3ed2e1902141aac772cd7908de06b402414b787e7f2371584e5cee6fc1cf82e9b80dce10ae0599082ee65a4dbd4f6c62a3c32bd3b154d47de25944b20
7
- data.tar.gz: dd970aad2f91aec70671b7364438ee7df79908c552a6826aad99318e10fb63b6ebcad5929f131fa4284ff5531c189061a83f499203188ac919dc74e6007d422f
6
+ metadata.gz: cd6f94e4b093ecab453e6e7f2056bfb7b52fbf2cfec51a26eceb2761b98c78bfd0fe273f083b1ec7db69f553ac7b8fb594e4d7c31ea8468e02337611b0bd4541
7
+ data.tar.gz: 4b5d924834a9168458ad50afcf6b27df5ba9ab50632b4b81db1e226235c7ebe80540e05fdc4aa6a6a608a6365e83f937304e0289a9d8e5689480f3021f6dd07e
checksums.yaml.gz.sig CHANGED
@@ -1,2 +1 @@
1
- ��Gӹ������ =�|)�і��c�澫W^P��&d����Lx�<����L��A 8���y(�Չ���2+�\O,�So�Gɲ�)����5ו�����L (@���Ea���ܴo��f� d!��4zn�2t�_��%9��[�?Y!�*Bﳯ���Wa���nO�c�Oz �`x�Z|n"V��d,���H���@�����V��
2
- �|�A�C���\�~ۀ.�T)? ~\G��kG��z��� ����}'>
1
+ 2�Qk��� :�x_��'{Ѷ?����Y������;�}���5
@@ -3,74 +3,19 @@
3
3
  require 'bundler/setup'
4
4
  require 'optparse'
5
5
  require 'ruby_smb'
6
- require 'ruby_smb/gss/provider/ntlm'
7
6
 
8
7
  # we just need *a* default encoding to handle the strings from the NTLM messages
9
8
  Encoding.default_internal = 'UTF-8' if Encoding.default_internal.nil?
10
9
 
11
- options = {
12
- allow_anonymous: true,
13
- domain: nil,
14
- username: 'RubySMB',
15
- password: 'password',
16
- share_name: 'home',
17
- share_path: '.',
18
- smbv1: true,
19
- smbv2: true,
20
- smbv3: true
21
- }
22
- OptionParser.new do |opts|
23
- opts.banner = "Usage: #{File.basename(__FILE__)} [options]"
24
- opts.on("--path PATH", "The path to share (default: #{options[:share_path]})") do |path|
10
+ options = RubySMB::Server::Cli.parse(defaults: { share_path: '.' }) do |options, parser|
11
+ parser.banner = "Usage: #{File.basename(__FILE__)} [options]"
12
+
13
+ parser.on("--share-path SHARE_PATH", "The path to share (default: #{options[:share_path]})") do |path|
25
14
  options[:share_path] = path
26
15
  end
27
- opts.on("--share SHARE", "The share name (default: #{options[:share_name]})") do |share|
28
- options[:share_name] = share
29
- end
30
- opts.on("--[no-]anonymous", "Allow anonymous access (default: #{options[:allow_anonymous]})") do |allow_anonymous|
31
- options[:allow_anonymous] = allow_anonymous
32
- end
33
- opts.on("--[no-]smbv1", "Enable or disable SMBv1 (default: #{options[:smbv1] ? 'Enabled' : 'Disabled'})") do |smbv1|
34
- options[:smbv1] = smbv1
35
- end
36
- opts.on("--[no-]smbv2", "Enable or disable SMBv2 (default: #{options[:smbv2] ? 'Enabled' : 'Disabled'})") do |smbv2|
37
- options[:smbv2] = smbv2
38
- end
39
- opts.on("--[no-]smbv3", "Enable or disable SMBv3 (default: #{options[:smbv3] ? 'Enabled' : 'Disabled'})") do |smbv3|
40
- options[:smbv3] = smbv3
41
- end
42
- opts.on("--username USERNAME", "The account's username (default: #{options[:username]})") do |username|
43
- if username.include?('\\')
44
- options[:domain], options[:username] = username.split('\\', 2)
45
- else
46
- options[:username] = username
47
- end
48
- end
49
- opts.on("--password PASSWORD", "The account's password (default: #{options[:password]})") do |password|
50
- options[:password] = password
51
- end
52
- end.parse!
53
-
54
- ntlm_provider = RubySMB::Gss::Provider::NTLM.new(allow_anonymous: options[:allow_anonymous])
55
- ntlm_provider.put_account(options[:username], options[:password], domain: options[:domain]) # password can also be an NTLM hash
56
-
57
- server = RubySMB::Server.new(
58
- gss_provider: ntlm_provider,
59
- logger: :stdout
60
- )
61
- server.dialects.select! { |dialect| RubySMB::Dialect[dialect].family != RubySMB::Dialect::FAMILY_SMB1 } unless options[:smbv1]
62
- server.dialects.select! { |dialect| RubySMB::Dialect[dialect].family != RubySMB::Dialect::FAMILY_SMB2 } unless options[:smbv2]
63
- server.dialects.select! { |dialect| RubySMB::Dialect[dialect].family != RubySMB::Dialect::FAMILY_SMB3 } unless options[:smbv3]
64
-
65
- if server.dialects.empty?
66
- puts "at least one version must be enabled"
67
- exit false
68
16
  end
69
17
 
18
+ server = RubySMB::Server::Cli.build(options)
70
19
  server.add_share(RubySMB::Server::Share::Provider::Disk.new(options[:share_name], options[:share_path]))
71
- puts "server is running"
72
- server.run do
73
- puts "received connection"
74
- true
75
- end
76
20
 
21
+ RubySMB::Server::Cli.run(server)
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'optparse'
5
+ require 'ruby_smb'
6
+
7
+ # we just need *a* default encoding to handle the strings from the NTLM messages
8
+ Encoding.default_internal = 'UTF-8' if Encoding.default_internal.nil?
9
+
10
+ # see: https://en.wikipedia.org/wiki/Magic_8-ball#Possible_answers
11
+ MAGIC_8_BALL_ANSWERS = [
12
+ 'It is certain.',
13
+ 'It is decidedly so.',
14
+ 'Without a doubt.',
15
+ 'Yes definitely.',
16
+ 'You may rely on it.',
17
+ 'As I see it, yes.',
18
+ 'Most likely.',
19
+ 'Outlook good.',
20
+ 'Yes.',
21
+ 'Signs point to yes.',
22
+ 'Reply hazy, try again.',
23
+ 'Ask again later.',
24
+ 'Better not tell you now.',
25
+ 'Cannot predict now.',
26
+ 'Concentrate and ask again.',
27
+ 'Don\'t count on it.',
28
+ 'My reply is no.',
29
+ 'My sources say no.',
30
+ 'Outlook not so good.',
31
+ 'Very doubtful'
32
+ ]
33
+
34
+ options = RubySMB::Server::Cli.parse do |options, parser|
35
+ parser.banner = "Usage: #{File.basename(__FILE__)} [options]"
36
+
37
+ parser.on("--virtual-content CONTENT", "The virtual share contents") do |virtual_content|
38
+ options[:virtual_content] = virtual_content
39
+ end
40
+
41
+ parser.on("--virtual-name NAME", "The virtual share file name") do |virtual_name|
42
+ options[:virtual_name] = virtual_name
43
+ end
44
+
45
+ parser.on("--virtual-type TYPE", "The virtual share type") do |virtual_type|
46
+ options[:virtual_type] = virtual_type
47
+ end
48
+ end
49
+
50
+ server = RubySMB::Server::Cli.build(options)
51
+ virtual_disk = RubySMB::Server::Share::Provider::VirtualDisk.new(options[:share_name])
52
+
53
+ # greeting is a static text file
54
+ virtual_disk.add_static_file('greeting', 'Hello World!')
55
+
56
+ # self is this example file, it's read when it's added and its #stat object is copied over
57
+ virtual_disk.add_static_file('self/static', File.open(__FILE__))
58
+
59
+ # self is this example file, it's mapped in using a real Pathname object
60
+ virtual_disk.add_mapped_file('self/mapped', Pathname.new(File.expand_path(__FILE__)))
61
+
62
+ # magic_8_ball is a dynamic file that is generated each time it is open
63
+ virtual_disk.add_dynamic_file('magic_8_ball') do
64
+ MAGIC_8_BALL_ANSWERS.sample
65
+ end
66
+
67
+ if options[:virtual_content] && options[:virtual_name] && options[:virtual_type]
68
+ case options[:virtual_type].downcase
69
+ when 'static'
70
+ # for static, content is left as is
71
+ virtual_disk.add_static_file(options[:virtual_name], options[:virtual_content])
72
+ when 'mapped'
73
+ # for mapped, content is a file path
74
+ virtual_disk.add_mapped_file(options[:virtual_name], Pathname.new(File.expand_path(options[:virtual_content])))
75
+ when 'dynamic'
76
+ # for dynamic, content is a file path
77
+ virtual_disk.add_dynamic_file(options[:virtual_name]) do
78
+ File.read(options[:virtual_content])
79
+ end
80
+ else
81
+ puts "virtual type: #{options[:virtual_type]}, must be one of static, mapped, or dynamic"
82
+ exit false
83
+ end
84
+ elsif options[:virtual_content] || options[:virtual_name] || options[:virtual_type]
85
+ puts 'the --virtual-* flags are only used when all are specified'
86
+ exit false
87
+ end
88
+
89
+ server.add_share(virtual_disk)
90
+
91
+ RubySMB::Server::Cli.run(server)
@@ -146,7 +146,7 @@ module RubySMB
146
146
  end
147
147
 
148
148
  # Takes the raw binary string and returns a {RubySMB::SMB1::Packet::SessionSetupResponse}
149
- def smb1_ntlmssp_final_packet(raw_response)
149
+ def smb1_session_setup_response(raw_response)
150
150
  packet = RubySMB::SMB1::Packet::SessionSetupResponse.read(raw_response)
151
151
 
152
152
  unless packet.valid?
@@ -159,6 +159,11 @@ module RubySMB
159
159
  packet
160
160
  end
161
161
 
162
+ # Takes the raw binary string and returns a {RubySMB::SMB1::Packet::SessionSetupResponse}
163
+ def smb1_ntlmssp_final_packet(raw_response)
164
+ smb1_session_setup_response(raw_response)
165
+ end
166
+
162
167
  # Takes the raw binary string and returns a {RubySMB::SMB1::Packet::SessionSetupResponse}
163
168
  def smb1_ntlmssp_challenge_packet(raw_response)
164
169
  packet = RubySMB::SMB1::Packet::SessionSetupResponse.read(raw_response)
@@ -235,7 +240,7 @@ module RubySMB
235
240
  end
236
241
 
237
242
  # Takes the raw binary string and returns a {RubySMB::SMB2::Packet::SessionSetupResponse}
238
- def smb2_ntlmssp_final_packet(raw_response)
243
+ def smb2_session_setup_response(raw_response)
239
244
  packet = RubySMB::SMB2::Packet::SessionSetupResponse.read(raw_response)
240
245
  unless packet.valid?
241
246
  raise RubySMB::Error::InvalidPacket.new(
@@ -248,6 +253,11 @@ module RubySMB
248
253
  packet
249
254
  end
250
255
 
256
+ # Takes the raw binary string and returns a {RubySMB::SMB2::Packet::SessionSetupResponse}
257
+ def smb2_ntlmssp_final_packet(raw_response)
258
+ smb2_session_setup_response(raw_response)
259
+ end
260
+
251
261
  # Takes the raw binary string and returns a {RubySMB::SMB2::Packet::SessionSetupResponse}
252
262
  def smb2_ntlmssp_challenge_packet(raw_response)
253
263
  packet = RubySMB::SMB2::Packet::SessionSetupResponse.read(raw_response)
@@ -118,6 +118,7 @@ module RubySMB
118
118
  self.server_max_buffer_size = packet.parameter_block.max_buffer_size - 260
119
119
  self.negotiated_smb_version = 1
120
120
  self.session_encrypt_data = false
121
+ self.negotiation_security_buffer = packet.data_block.security_blob
121
122
  'SMB1'
122
123
  when RubySMB::SMB2::Packet::NegotiateResponse
123
124
  self.smb1 = false
@@ -137,6 +138,7 @@ module RubySMB
137
138
  self.server_start_time = packet.server_start_time.to_time if packet.server_start_time != 0
138
139
  self.server_system_time = packet.system_time.to_time if packet.system_time != 0
139
140
  self.server_supports_multi_credit = self.dialect != '0x0202' && packet&.capabilities&.large_mtu == 1
141
+ self.negotiation_security_buffer = packet.security_buffer
140
142
  case self.dialect
141
143
  when '0x02ff'
142
144
  when '0x0300', '0x0302'
@@ -295,6 +295,12 @@ module RubySMB
295
295
  # false otherwise
296
296
  attr_accessor :server_supports_multi_credit
297
297
 
298
+ # The negotiated security buffer. This is nil until the negotiation process
299
+ # has finished.
300
+ # @!attribute [rw] negotiation_security_buffer
301
+ # @return [String] The raw security buffer bytes
302
+ attr_accessor :negotiation_security_buffer
303
+
298
304
  # @param dispatcher [RubySMB::Dispatcher::Socket] the packet dispatcher to use
299
305
  # @param smb1 [Boolean] whether or not to enable SMB1 support
300
306
  # @param smb2 [Boolean] whether or not to enable SMB2 support
@@ -332,7 +338,7 @@ module RubySMB
332
338
  # session setup response is received
333
339
  @session_encrypt_data = always_encrypt
334
340
 
335
- @ntlm_client = Net::NTLM::Client.new(
341
+ @ntlm_client = RubySMB::NTLM::Client.new(
336
342
  @username,
337
343
  @password,
338
344
  workstation: @local_workstation,
@@ -404,7 +410,7 @@ module RubySMB
404
410
  @password = pass.encode('utf-8') || ''.encode('utf-8')
405
411
  @username = user.encode('utf-8') || ''.encode('utf-8')
406
412
 
407
- @ntlm_client = Net::NTLM::Client.new(
413
+ @ntlm_client = RubySMB::NTLM::Client.new(
408
414
  @username,
409
415
  @password,
410
416
  workstation: @local_workstation,
@@ -99,6 +99,10 @@ module RubySMB
99
99
  # unsupported protocol.
100
100
  class NegotiationFailure < RubySMBError; end
101
101
 
102
+ # Raised when Authentication fails, possibly due to an
103
+ # unsupported GSS mechanism type.
104
+ class AuthenticationFailure < RubySMBError; end
105
+
102
106
  # Raised when trying to parse raw binary into a BitField and the data
103
107
  # is invalid.
104
108
  class InvalidBitField < RubySMBError; end
@@ -0,0 +1,15 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileAccessInformation Class as defined in
5
+ # [2.4.1 FileAccessInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/01cf43d2-deb3-40d3-a39b-9e68693d7c90)
6
+ class FileAccessInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_ACCESS_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint32 :access_flags, label: 'Access Flags'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,45 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileAlignmentInformation Class as defined in
5
+ # [2.4.3 FileAlignmentInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/9b0b9971-85aa-4651-8438-f1c4298bcb0d)
6
+ class FileAlignmentInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_ALIGNMENT_INFORMATION
8
+
9
+ # If this value is specified, there are no alignment requirements for the device.
10
+ FILE_BYTE_ALIGNMENT = 0x00000000 # 0
11
+
12
+ # If this value is specified, data MUST be aligned on a 2-byte boundary.
13
+ FILE_WORD_ALIGNMENT = 0x00000001 # 1
14
+
15
+ # If this value is specified, data MUST be aligned on a 4-byte boundary.
16
+ FILE_LONG_ALIGNMENT = 0x00000003 # 3
17
+
18
+ # If this value is specified, data MUST be aligned on an 8-byte boundary.
19
+ FILE_QUAD_ALIGNMENT = 0x00000007 # 7
20
+
21
+ # If this value is specified, data MUST be aligned on a 16-byte boundary.
22
+ FILE_OCTA_ALIGNMENT = 0X0000000F # 15
23
+
24
+ # If this value is specified, data MUST be aligned on a 32-byte boundary.
25
+ FILE_32_BYTE_ALIGNMENT = 0X0000001F # 31
26
+
27
+ # If this value is specified, data MUST be aligned on a 64-byte boundary.
28
+ FILE_64_BYTE_ALIGNMENT = 0X0000003F # 63
29
+
30
+ # If this value is specified, data MUST be aligned on a 128-byte boundary.
31
+ FILE_128_BYTE_ALIGNMENT = 0X0000007F # 127
32
+
33
+ # If this value is specified, data MUST be aligned on a 256-byte boundary.
34
+ FILE_256_BYTE_ALIGNMENT = 0X000000FF # 255
35
+
36
+ # If this value is specified, data MUST be aligned on a 512-byte boundary.
37
+ FILE_512_BYTE_ALIGNMENT = 0X000001FF # 511
38
+
39
+ endian :little
40
+
41
+ uint32 :alignment_requirement, label: 'Alignment Requirement', initial_value: FILE_BYTE_ALIGNMENT
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,23 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileAllInformation Class as defined in
5
+ # [2.4.2 FileAllInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/95f3056a-ebc1-4f5d-b938-3f68a44677a6)
6
+ class FileAllInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_ALL_INFORMATION
8
+
9
+ endian :little
10
+
11
+ file_basic_information :basic_information, label: 'Basic Information'
12
+ file_standard_information :standard_information, label: 'Standard Information'
13
+ file_internal_information :internal_information, label: 'Internal Information'
14
+ file_ea_information :ea_information, label: 'EA Information'
15
+ file_access_information :access_information, label: 'Access Information'
16
+ file_position_information :position_information, label: 'Position Information'
17
+ file_mode_information :mode_information, label: 'Mode Information'
18
+ file_alignment_information :alignment_information, label: 'Alignment Information'
19
+ file_name_information :name_information, label: 'Name Information'
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileBasicInformation Class as defined in
5
+ # [2.4.7 FileBasicInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/16023025-8a78-492f-8b96-c873b042ac50)
6
+ class FileBasicInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_BASIC_INFORMATION
8
+
9
+ endian :little
10
+
11
+ file_time :create_time, label: 'Create Time'
12
+ file_time :last_access, label: 'Last Accessed Time'
13
+ file_time :last_write, label: 'Last Write Time'
14
+ file_time :last_change, label: 'Last Modified Time'
15
+ file_attributes :file_attributes, label: 'File Attributes'
16
+ string :reserved, label: 'Reserved', length: 4
17
+ end
18
+ end
19
+ end
20
+ end
@@ -2,7 +2,7 @@ module RubySMB
2
2
  module Fscc
3
3
  module FileInformation
4
4
  # The FileBothDirectoryInformation Class as defined in
5
- # [2.4.8 FileBothDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232095.aspx)
5
+ # [2.4.8 FileBothDirectoryInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/270df317-9ba5-4ccb-ba00-8d22be139bc5)
6
6
  class FileBothDirectoryInformation < BinData::Record
7
7
  CLASS_LEVEL = FileInformation::FILE_BOTH_DIRECTORY_INFORMATION
8
8
 
@@ -14,8 +14,8 @@ module RubySMB
14
14
  file_time :last_access, label: 'Last Accessed Time'
15
15
  file_time :last_write, label: 'Last Write Time'
16
16
  file_time :last_change, label: 'Last Modified Time'
17
- uint64 :end_of_file, label: 'End of File'
18
- uint64 :allocation_size, label: 'Allocated Size'
17
+ int64 :end_of_file, label: 'End of File'
18
+ int64 :allocation_size, label: 'Allocated Size'
19
19
  file_attributes :file_attributes, label: 'File Attributes'
20
20
  uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
21
21
  uint32 :ea_size, label: 'Extended Attributes Size'
@@ -2,7 +2,7 @@ module RubySMB
2
2
  module Fscc
3
3
  module FileInformation
4
4
  # The FileDirectoryInformation Class as defined in
5
- # [2.4.10 FileDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232097.aspx)
5
+ # [2.4.10 FileDirectoryInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/b38bf518-9057-4c88-9ddd-5e2d3976a64b)
6
6
  class FileDirectoryInformation < BinData::Record
7
7
  CLASS_LEVEL = FileInformation::FILE_DIRECTORY_INFORMATION
8
8
 
@@ -14,8 +14,8 @@ module RubySMB
14
14
  file_time :last_access, label: 'Last Accessed Time'
15
15
  file_time :last_write, label: 'Last Write Time'
16
16
  file_time :last_change, label: 'Last Modified Time'
17
- uint64 :end_of_file, label: 'End of File'
18
- uint64 :allocation_size, label: 'Allocated Size'
17
+ int64 :end_of_file, label: 'End of File'
18
+ int64 :allocation_size, label: 'Allocated Size'
19
19
  file_attributes :file_attributes, label: 'File Attributes'
20
20
  uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
21
21
  string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
@@ -7,6 +7,7 @@ module RubySMB
7
7
  CLASS_LEVEL = FileInformation::FILE_EA_INFORMATION
8
8
 
9
9
  endian :little
10
+
10
11
  uint32 :ea_size, label: 'Extended Attributes Size'
11
12
  end
12
13
  end
@@ -2,7 +2,7 @@ module RubySMB
2
2
  module Fscc
3
3
  module FileInformation
4
4
  # The FileFullDirectoryInformation Class as defined in
5
- # [2.4.14 FileFullDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232068.aspx)
5
+ # [2.4.14 FileFullDirectoryInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/e8d926d1-3a22-4654-be9c-58317a85540b)
6
6
  class FileFullDirectoryInformation < BinData::Record
7
7
  CLASS_LEVEL = FileInformation::FILE_FULL_DIRECTORY_INFORMATION
8
8
 
@@ -14,8 +14,8 @@ module RubySMB
14
14
  file_time :last_access, label: 'Last Accessed Time'
15
15
  file_time :last_write, label: 'Last Write Time'
16
16
  file_time :last_change, label: 'Last Modified Time'
17
- uint64 :end_of_file, label: 'End of File'
18
- uint64 :allocation_size, label: 'Allocated Size'
17
+ int64 :end_of_file, label: 'End of File'
18
+ int64 :allocation_size, label: 'Allocated Size'
19
19
  file_attributes :file_attributes, label: 'File Attributes'
20
20
  uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
21
21
  uint32 :ea_size, label: 'Extended Attributes Size'
@@ -14,8 +14,8 @@ module RubySMB
14
14
  file_time :last_access, label: 'Last Accessed Time'
15
15
  file_time :last_write, label: 'Last Write Time'
16
16
  file_time :last_change, label: 'Last Modified Time'
17
- uint64 :end_of_file, label: 'End of File'
18
- uint64 :allocation_size, label: 'Allocated Size'
17
+ int64 :end_of_file, label: 'End of File'
18
+ int64 :allocation_size, label: 'Allocated Size'
19
19
  file_attributes :file_attributes, label: 'File Attributes'
20
20
  uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
21
21
  uint32 :ea_size, label: 'Extended Attributes Size'
@@ -23,7 +23,7 @@ module RubySMB
23
23
  uint8 :reserved, label: 'Reserved Space'
24
24
  string16 :short_name, label: 'File Short Name', length: 24
25
25
  uint16 :reserved2, label: 'Reserved Space'
26
- uint64 :file_id, label: 'File Id'
26
+ uint64 :file_id, label: 'File ID'
27
27
  string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
28
28
  end
29
29
  end
@@ -2,7 +2,7 @@ module RubySMB
2
2
  module Fscc
3
3
  module FileInformation
4
4
  # The FileIdDirectoryInformation Class as defined in
5
- # [2.4.18 FileIdFullDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232071.aspx)
5
+ # [2.4.18 FileIdFullDirectoryInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/ab8e7558-899c-4be1-a7c5-3a9ae8ab76a0)
6
6
  class FileIdFullDirectoryInformation < BinData::Record
7
7
  CLASS_LEVEL = FileInformation::FILE_ID_FULL_DIRECTORY_INFORMATION
8
8
 
@@ -14,8 +14,8 @@ module RubySMB
14
14
  file_time :last_access, label: 'Last Accessed Time'
15
15
  file_time :last_write, label: 'Last Write Time'
16
16
  file_time :last_change, label: 'Last Modified Time'
17
- uint64 :end_of_file, label: 'End of File'
18
- uint64 :allocation_size, label: 'Allocated Size'
17
+ int64 :end_of_file, label: 'End of File'
18
+ int64 :allocation_size, label: 'Allocated Size'
19
19
  file_attributes :file_attributes, label: 'File Attributes'
20
20
  uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
21
21
  uint32 :ea_size, label: 'Extended Attributes Size'
@@ -0,0 +1,15 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileInternalInformation Class as defined in
5
+ # [2.4.22 FileInternalInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/7d796611-2fa5-41ac-8178-b6fea3a017b3)
6
+ class FileInternalInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_INTERNAL_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint64 :file_id, label: 'File ID'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileModeInformation Class as defined in
5
+ # [2.4.26 FileModeInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/52df7798-8330-474b-ac31-9afe8075640c)
6
+ class FileModeInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_MODE_INFORMATION
8
+
9
+ endian :little
10
+
11
+ struct :flags do
12
+ bit2 :reserved
13
+ bit1 :file_synchronous_io_nonalert, label: 'File Synchronous IO Nonalert'
14
+ bit1 :file_synchronous_io_alert, label: 'File Synchronous IO Alert'
15
+ bit1 :file_no_intermediate_buffering, label: 'File No Intermediate Buffering'
16
+ bit1 :file_sequential_only, label: 'File Sequential Only'
17
+ bit1 :file_write_through, label: 'File Write Through'
18
+ bit1 :reserved2
19
+ # byte boundary
20
+ bit3 :reserved3
21
+ bit1 :file_delete_on_close, label: 'File Delete On Close'
22
+ bit4 :reserved4
23
+ # byte boundary
24
+ bit16 :reserved5
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileNameInformation Class as defined in
5
+ # [2.4.27 FileNameInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/cb30e415-54c5-4483-a346-822ea90e1e89)
6
+ class FileNameInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_NAME_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
12
+ string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
13
+ end
14
+ end
15
+ end
16
+ end
@@ -2,7 +2,7 @@ module RubySMB
2
2
  module Fscc
3
3
  module FileInformation
4
4
  # The FileNamesInformation Class as defined in
5
- # [2.4.26 FileNamesInformation](https://msdn.microsoft.com/en-us/library/cc232077.aspx)
5
+ # [2.4.28 FileNamesInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/a289f7a8-83d2-4927-8c88-b2d328dde5a5)
6
6
  class FileNamesInformation < BinData::Record
7
7
  CLASS_LEVEL = FileInformation::FILE_NAMES_INFORMATION
8
8
 
@@ -0,0 +1,16 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileNormalizedNameInformation Class as defined in
5
+ # [2.4.30 FileNormalizedNameInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/20bcadba-808c-4880-b757-4af93e41edf6)
6
+ class FileNormalizedNameInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_NORMALIZED_NAME_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
12
+ string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FilePositionInformation Class as defined in
5
+ # [2.4.35 FilePositionInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/e3ce4a39-327e-495c-99b6-6b61606b6f16)
6
+ class FilePositionInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_POSITION_INFORMATION
8
+
9
+ endian :little
10
+
11
+ int64 :current_byte_offset, label: 'Current Byte Offset'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -4,7 +4,7 @@ module RubySMB
4
4
  # The FileRenameInformation Class as defined in
5
5
  # [2.4.34.2 FileRenameInformation](https://msdn.microsoft.com/en-us/library/cc704597.aspx)
6
6
  class FileRenameInformation < BinData::Record
7
- CLASS_LEVEL = FileInformation::FILE_ID_FULL_DIRECTORY_INFORMATION
7
+ CLASS_LEVEL = FileInformation::FILE_RENAME_INFORMATION
8
8
 
9
9
  endian :little
10
10