diff options
author | Claire McQuin <claire@chef.io> | 2015-08-28 15:40:22 -0700 |
---|---|---|
committer | Claire McQuin <claire@chef.io> | 2015-08-28 15:40:22 -0700 |
commit | 47eb6d06abc7e8c0a77294b7eb38ede098260fe8 (patch) | |
tree | d3f4c5889015dc885b6fd5cd65cbfe2cd4ac4db5 | |
parent | a5d6632b7c011b0151a3d69c460c43b4352007e8 (diff) | |
download | chef-mcquin/registry-delete-value.tar.gz |
Use FFI to delete registry values.mcquin/registry-delete-value
-rw-r--r-- | lib/chef/win32/api/registry.rb | 37 | ||||
-rw-r--r-- | lib/chef/win32/registry.rb | 18 |
2 files changed, 53 insertions, 2 deletions
diff --git a/lib/chef/win32/api/registry.rb b/lib/chef/win32/api/registry.rb new file mode 100644 index 0000000000..f463429209 --- /dev/null +++ b/lib/chef/win32/api/registry.rb @@ -0,0 +1,37 @@ +# +# Copyright:: Copyright 2015 Opscode, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'chef/win32/api' + +class Chef + module ReservedNames::Win32 + module API + module Registry + extend Chef::ReservedNames::Win32::API + + ffi_lib 'advapi32' + + # LONG WINAPI RegDeleteValue( + # _In_ HKEY hKey, + # _In_opt_ LPCTSTR lpValueName + # ); + safe_attach_function :RegDeleteValueW, [ :HKEY, :LPCTSTR ], :LONG + + end + end + end +end
\ No newline at end of file diff --git a/lib/chef/win32/registry.rb b/lib/chef/win32/registry.rb index 1a1aa12fad..1ab15c8aee 100644 --- a/lib/chef/win32/registry.rb +++ b/lib/chef/win32/registry.rb @@ -16,7 +16,9 @@ # See the License for the specific language governing permissions and # limitations under the License. # +require 'chef/mixin/wstring' require 'chef/reserved_names' +require 'chef/win32/api/registry' if RUBY_PLATFORM =~ /mswin|mingw32|windows/ require 'win32/registry' @@ -26,6 +28,9 @@ end class Chef class Win32 class Registry + + include Chef::Mixin::WideString + include Chef::ReservedNames::Win32::API::Registry attr_accessor :run_context attr_accessor :architecture @@ -80,7 +85,7 @@ class Chef return true end hive.open(key, ::Win32::Registry::KEY_SET_VALUE | registry_system_architecture) do |reg| - reg.delete_value(value[:name]) + reg_delete_value(reg, value[:name]) Chef::Log.debug("Deleted value #{value[:name]} from registry key #{key_path}") end else @@ -383,7 +388,16 @@ class Chef hive_name = reg_path.shift key = reg_path.join("\\") end - + + # ::Win32::Registry#delete_value is broken in Ruby 2.1 + # (up to Ruby 2.1.6p336). This should be resolved a + # later release (see note #9 in link below). + # https://bugs.ruby-lang.org/issues/10820 + def reg_delete_value(reg, value) + unless RegDeleteValueW(reg.hkey, wstring(value)) + Chef::ReservedNames::Win32::Error.raise! + end + end end end end |