diff options
Diffstat (limited to 'lib/chef/win32/registry.rb')
-rw-r--r-- | lib/chef/win32/registry.rb | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/lib/chef/win32/registry.rb b/lib/chef/win32/registry.rb index 64cc18f038..7674abf08c 100644 --- a/lib/chef/win32/registry.rb +++ b/lib/chef/win32/registry.rb @@ -22,12 +22,20 @@ require 'win32/api' require 'chef/win32/api/registry' require 'chef/mixin/wstring' +if RUBY_PLATFORM =~ /mswin|mingw32|windows/ + require 'win32/registry' + require 'win32/api' +end + class Chef class Win32 class Registry include Chef::ReservedNames::Win32::API::Registry extend Chef::ReservedNames::Win32::API::Registry + + include Chef::Mixin::WideString + extend Chef::Mixin::WideString include Chef::Mixin::WideString extend Chef::Mixin::WideString @@ -48,9 +56,51 @@ class Chef def get_values(key_path) hive, key = get_hive_and_key(key_path) key_exists!(key_path) - values = hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |reg| - reg.map { |name, type, data| {:name=>name, :type=>get_name_from_type(type), :data=>data} } + + phkey = FFI::MemoryPointer.new(:ulong) + result = RegOpenKeyExW(hive.hkey, wstring(key), 0, ::Win32::Registry::KEY_QUERY_VALUE | registry_system_architecture, phkey) + # do something if result != 0 + + hkey = phkey.read_ulong + values_ptr = FFI::MemoryPointer.new(:uint32) + max_value_name_len_ptr = FFI::MemoryPointer.new(:uint32) + max_value_len_ptr = FFI::MemoryPointer.new(:uint32) + RegQueryInfoKeyW(hkey, nil, nil, nil, nil, nil, nil, values_ptr, max_value_name_len_ptr, max_value_len_ptr, nil, nil) + + values = [ ] + + max_value_name_len = max_value_name_len_ptr.read_uint32 # characters w/o null terminater + max_value_len = max_value_len_ptr.read_uint32 # bytes, incl terminaters + name_ptr = FFI::MemoryPointer.new(:uint16, max_value_name_len + 1) + name_size_ptr = FFI::MemoryPointer.new(:uint32) + type_ptr = FFI::MemoryPointer.new(:uint32) + data_ptr = FFI::MemoryPointer.new(:uint32, max_value_len) + data_size_ptr = FFI::MemoryPointer.new(:uint32) + values_ptr.read_uint32.times do |index| + name_size_ptr.write_uint32(max_value_name_len + 1) + data_size_ptr.write_uint32(max_value_len) + + RegEnumValueW(hkey, index, name_ptr, name_size_ptr, nil, type_ptr, data_ptr, data_size_ptr) + + name = name_ptr.read_wstring(name_size_ptr.read_uint32) + type = get_name_from_type(type_ptr.read_uint32) + data = case type + when :string + data_ptr.read_wstring + when :multi_string + data_ptr.read_array_of_wstring + else + data_ptr.read_bytes(data_size_ptr.read_uint32) + end + + values << { :name => name, :type => type, :data => data } end + + values + + # values = hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |reg| + # reg.map { |name, type, data| {:name=>name, :type=>get_name_from_type(type), :data=>data} } + # end end def set_value(key_path, value) |