summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Wrock <matt@mattwrock.com>2016-02-18 15:48:31 -0800
committerMatt Wrock <matt@mattwrock.com>2016-02-18 15:48:31 -0800
commit5ee5d196b52200701f67dc65a36d937d1388d067 (patch)
treefc4c42048385b25320db3591bfc552aa6e61dcea
parentcab6243b977c501366721965c6ccd039f33646cf (diff)
downloadchef-5ee5d196b52200701f67dc65a36d937d1388d067.tar.gz
fallback to netmsg.dll error table if error message is not found in system errors
-rw-r--r--lib/chef/win32/api/error.rb35
-rw-r--r--lib/chef/win32/error.rb14
2 files changed, 45 insertions, 4 deletions
diff --git a/lib/chef/win32/api/error.rb b/lib/chef/win32/api/error.rb
index aa80f89743..dc83f9cb2b 100644
--- a/lib/chef/win32/api/error.rb
+++ b/lib/chef/win32/api/error.rb
@@ -874,6 +874,20 @@ class Chef
SEM_NOGPFAULTERRORBOX = 0x0002
SEM_NOOPENFILEERRORBOX = 0x8000
+ # Flags for LoadLibraryEx
+
+ DONT_RESOLVE_DLL_REFERENCES = 0x00000001
+ LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010
+ LOAD_LIBRARY_AS_DATAFILE = 0x00000002
+ LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040
+ LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020
+ LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 0x00000200
+ LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000
+ LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 0x00000100
+ LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800
+ LOAD_LIBRARY_SEARCH_USER_DIRS = 0x00000400
+ LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008
+
###############################################
# Win32 API Bindings
###############################################
@@ -891,8 +905,8 @@ DWORD WINAPI FormatMessage(
__in_opt va_list *Arguments
);
=end
- safe_attach_function :FormatMessageA, [:DWORD, :LPCVOID, :DWORD, :DWORD, :LPTSTR, :DWORD, :varargs], :DWORD
- safe_attach_function :FormatMessageW, [:DWORD, :LPCVOID, :DWORD, :DWORD, :LPWSTR, :DWORD, :varargs], :DWORD
+ safe_attach_function :FormatMessageA, [:DWORD, :HANDLE, :DWORD, :DWORD, :LPTSTR, :DWORD, :varargs], :DWORD
+ safe_attach_function :FormatMessageW, [:DWORD, :HANDLE, :DWORD, :DWORD, :LPWSTR, :DWORD, :varargs], :DWORD
=begin
DWORD WINAPI GetLastError(void);
@@ -916,6 +930,23 @@ UINT WINAPI SetErrorMode(
=end
safe_attach_function :SetErrorMode, [:UINT], :UINT
+=begin
+https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
+HMODULE WINAPI LoadLibraryEx(
+ _In_ LPCTSTR lpFileName,
+ _Reserved_ HANDLE hFile,
+ _In_ DWORD dwFlags
+);
+=end
+ safe_attach_function :LoadLibraryExW, [:LPCTSTR, :HANDLE, :DWORD], :HANDLE
+
+=begin
+https://msdn.microsoft.com/en-us/library/windows/desktop/ms683152(v=vs.85).aspx
+BOOL WINAPI FreeLibrary(
+ _In_ HMODULE hModule
+);
+=end
+ safe_attach_function :FreeLibrary, [:HANDLE], :BOOL
end
end
end
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