class Chef::ReservedNames::Win32::Error

Public Class Methods

format_message(message_id = 0, args = {}) click to toggle source
# File lib/chef/win32/error.rb, line 30
def self.format_message(message_id = 0, args = {})
  flags = args[:flags] || FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY
  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, 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

  # Extract the string
  begin
    buffer.read_pointer.read_wstring(num_chars)
  ensure
    Chef::ReservedNames::Win32::Memory.local_free(buffer.read_pointer)
  end
end
get_last_error() click to toggle source
# File lib/chef/win32/error.rb, line 59
def self.get_last_error
  FFI::LastError.error
end
raise!(message = nil, code = get_last_error) click to toggle source

Raises the last error. This should only be called by Win32 API wrapper functions, and then only when wrapped in an if() statement (since it unconditionally exits)

Returns

nil:

always returns nil when it does not raise

Raises

Chef::Exceptions::Win32APIError:
# File lib/chef/win32/error.rb, line 70
def self.raise!(message = nil, code = get_last_error)
  msg = format_message(code).strip
  if code == ERROR_USER_NOT_FOUND
    raise Chef::Exceptions::UserIDNotFound, msg
  else
    formatted_message = ""
    formatted_message << message if message
    formatted_message << "---- Begin Win32 API output ----\n"
    formatted_message << "System Error Code: #{code}\n"
    formatted_message << "System Error Message: #{msg}\n"
    formatted_message << "---- End Win32 API output ----\n"
    raise Chef::Exceptions::Win32APIError, msg + "\n" + formatted_message
  end
end