diff options
Diffstat (limited to 'lib/chef/win32/error.rb')
-rw-r--r-- | lib/chef/win32/error.rb | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/chef/win32/error.rb b/lib/chef/win32/error.rb index 8c3ff2f08f..83d4583f1d 100644 --- a/lib/chef/win32/error.rb +++ b/lib/chef/win32/error.rb @@ -29,11 +29,21 @@ class Chef def self.format_message(message_id = 0, args = {}) flags = args[:flags] || FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY - source = args[:source] + flags |= FORMAT_MESSAGE_ALLOCATE_BUFFER + source = args[:source] || 0 language_id = args[:language_id] || 0 varargs = args[:varargs] || [:int, 0] buffer = FFI::MemoryPointer.new :pointer - num_chars = FormatMessageW(flags | FORMAT_MESSAGE_ALLOCATE_BUFFER, source, message_id, language_id, buffer, 0, *varargs) + num_chars = FormatMessageW(flags, source, message_id, language_id, buffer, 0, *varargs) + if num_chars == 0 + source = LoadLibraryExW("netmsg.dll".to_wstring, 0, LOAD_LIBRARY_AS_DATAFILE) + begin + num_chars = FormatMessageW(flags | FORMAT_MESSAGE_FROM_HMODULE, source, message_id, language_id, buffer, 0, *varargs) + ensure + FreeLibrary(source) + end + end + if num_chars == 0 raise! end |