diff options
author | Salim Alam <salam@chef.io> | 2015-08-13 14:25:48 -0700 |
---|---|---|
committer | Salim Alam <salam@chef.io> | 2015-08-19 11:08:17 -0700 |
commit | 6c4cd5c6d5c40baca723bf95cdbccdda59021198 (patch) | |
tree | f2d6357705440c11467b46c60eac0b4c5ddb871e /lib/chef/mixin/windows_architecture_helper.rb | |
parent | fe6676bab51390429674b0ecd4670924ffb09cc5 (diff) | |
download | chef-6c4cd5c6d5c40baca723bf95cdbccdda59021198.tar.gz |
Enable 64-bit support for Powershell and Batch scripts
Diffstat (limited to 'lib/chef/mixin/windows_architecture_helper.rb')
-rw-r--r-- | lib/chef/mixin/windows_architecture_helper.rb | 54 |
1 files changed, 15 insertions, 39 deletions
diff --git a/lib/chef/mixin/windows_architecture_helper.rb b/lib/chef/mixin/windows_architecture_helper.rb index c5f3e1bd79..744001f8a2 100644 --- a/lib/chef/mixin/windows_architecture_helper.rb +++ b/lib/chef/mixin/windows_architecture_helper.rb @@ -19,19 +19,13 @@ require 'chef/exceptions' require 'chef/platform/query_helpers' -require 'win32/api' if Chef::Platform.windows? -require 'chef/win32/api/process' if Chef::Platform.windows? -require 'chef/win32/api/error' if Chef::Platform.windows? +require 'chef/win32/process' if Chef::Platform.windows? +require 'chef/win32/system' if Chef::Platform.windows? class Chef module Mixin module WindowsArchitectureHelper - if Chef::Platform.windows? - include Chef::ReservedNames::Win32::API::Process - include Chef::ReservedNames::Win32::API::Error - end - def node_windows_architecture(node) node[:kernel][:machine].to_sym end @@ -42,6 +36,16 @@ class Chef is_i386_process_on_x86_64_windows? end + def forced_32bit_override_required?(node, desired_architecture) + desired_architecture == :i386 && + node_windows_architecture(node) == :x86_64 && + !is_i386_process_on_x86_64_windows? + end + + def wow64_directory + Chef::ReservedNames::Win32::System.get_system_wow64_directory + end + def with_os_architecture(node, architecture: nil) node ||= begin os_arch = ENV['PROCESSOR_ARCHITEW6432'] || @@ -88,49 +92,21 @@ class Chef def is_i386_process_on_x86_64_windows? if Chef::Platform.windows? - is_64_bit_process_result = FFI::MemoryPointer.new(:int) - - # The return value of IsWow64Process is nonzero value if the API call succeeds. - # The result data are returned in the last parameter, not the return value. - call_succeeded = IsWow64Process(GetCurrentProcess(), is_64_bit_process_result) - - # The result is nonzero if IsWow64Process's calling process, in the case here - # this process, is running under WOW64, i.e. the result is nonzero if this - # process is 32-bit (aka :i386). - result = (call_succeeded != 0) && (is_64_bit_process_result.get_int(0) != 0) + Chef::ReservedNames::Win32::Process.is_wow64_process else false end end def disable_wow64_file_redirection( node ) - original_redirection_state = ['0'].pack('P') - if ( ( node_windows_architecture(node) == :x86_64) && ::Chef::Platform.windows?) - win32_wow_64_disable_wow_64_fs_redirection = - ::Win32::API.new('Wow64DisableWow64FsRedirection', 'P', 'L', 'kernel32') - - succeeded = win32_wow_64_disable_wow_64_fs_redirection.call(original_redirection_state) - - if succeeded == 0 - raise Win32APIError "Failed to disable Wow64 file redirection" - end - + Chef::ReservedNames::Win32::System.wow64_disable_wow64_fs_redirection end - - original_redirection_state end def restore_wow64_file_redirection( node, original_redirection_state ) if ( (node_windows_architecture(node) == :x86_64) && ::Chef::Platform.windows?) - win32_wow_64_revert_wow_64_fs_redirection = - ::Win32::API.new('Wow64RevertWow64FsRedirection', 'P', 'L', 'kernel32') - - succeeded = win32_wow_64_revert_wow_64_fs_redirection.call(original_redirection_state) - - if succeeded == 0 - raise Win32APIError "Failed to revert Wow64 file redirection" - end + Chef::ReservedNames::Win32::System.wow64_revert_wow64_fs_redirection(original_redirection_state) end end |