summaryrefslogtreecommitdiff
path: root/lib/chef/win32/error.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef/win32/error.rb')
-rw-r--r--lib/chef/win32/error.rb14
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