summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaire McQuin <claire@chef.io>2015-08-28 15:40:22 -0700
committerClaire McQuin <claire@getchef.com>2015-09-01 13:44:56 -0700
commit9121bd4bc2a3ac892f908a40b8453e2302552e38 (patch)
tree1e90b2d326ca3ded5b735c65ff3387c020bc261e
parent3770ec1025fd09d3a3bb393ad955ee2985252a67 (diff)
downloadchef-9121bd4bc2a3ac892f908a40b8453e2302552e38.tar.gz
Use FFI to delete registry values.
Conflicts: lib/chef/win32/api/registry.rb lib/chef/win32/registry.rb
-rw-r--r--lib/chef/win32/api/registry.rb8
-rw-r--r--lib/chef/win32/registry.rb13
2 files changed, 18 insertions, 3 deletions
diff --git a/lib/chef/win32/api/registry.rb b/lib/chef/win32/api/registry.rb
index 45b91d7d32..ded4a3630a 100644
--- a/lib/chef/win32/api/registry.rb
+++ b/lib/chef/win32/api/registry.rb
@@ -39,7 +39,13 @@ class Chef
safe_attach_function :RegDeleteKeyExW, [ :HKEY, :LPCTSTR, :LONG, :DWORD ], :LONG
safe_attach_function :RegDeleteKeyExA, [ :HKEY, :LPCTSTR, :LONG, :DWORD ], :LONG
+ # 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
+end
diff --git a/lib/chef/win32/registry.rb b/lib/chef/win32/registry.rb
index 2bb7b78965..830fd300a0 100644
--- a/lib/chef/win32/registry.rb
+++ b/lib/chef/win32/registry.rb
@@ -16,9 +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'
-require 'chef/mixin/wstring'
if RUBY_PLATFORM =~ /mswin|mingw32|windows/
require 'chef/win32/api/registry'
@@ -91,7 +91,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
@@ -394,6 +394,15 @@ class Chef
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