# File lib/facter/util/windows/error.rb, line 22
  def self.format_error_code(code)
    # specifying 0 will look for LANGID in the following order

    # 1.Language neutral

    # 2.Thread LANGID, based on the thread's locale value

    # 3.User default LANGID, based on the user's default locale value

    # 4.System default LANGID, based on the system default locale value

    # 5.US English

    dwLanguageId = 0
    flags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_ARGUMENT_ARRAY |
        FORMAT_MESSAGE_IGNORE_INSERTS |
        FORMAT_MESSAGE_MAX_WIDTH_MASK
    error_string = ''

    # this pointer actually points to a :lpwstr (pointer) since we're letting Windows allocate for us

    FFI::MemoryPointer.new(:pointer, 1) do |buffer_ptr|
      length = FormatMessageW(flags, FFI::Pointer::NULL, code, dwLanguageId,
                              buffer_ptr, 0, FFI::Pointer::NULL)

      if length == Facter::Util::Windows::FFI::WIN32_FALSE
        # can't raise same error type here or potentially recurse infinitely

        raise Facter::Error.new("FormatMessageW could not format code #{code}")
      end

      # returns an FFI::Pointer with autorelease set to false, which is what we want

      Facter::Util::Windows::FFI.read_win32_local_pointer(buffer_ptr) do |wide_string_ptr|
        if wide_string_ptr.null?
          raise Facter::Error.new("FormatMessageW failed to allocate buffer for code #{code}")
        end

        error_string = Facter::Util::Windows::FFI.read_wide_string(wide_string_ptr, length)
      end
    end

    error_string
  end