# 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
      source = args[:source]
      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)
      if num_chars == 0
        raise!
      end

      # Extract the string
      begin
        return 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 49
    def self.get_last_error
      GetLastError()
    end

raise!(message = nil) 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 60
    def self.raise!(message = nil)
      code = get_last_error
      msg = format_message(code).strip
      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