Sha256: b24e47d3c40fe9c340b9d073cc1f18b089c4594ac8b0ad95bc05ea7886210488

Contents?: true

Size: 1.5 KB

Versions: 2

Compression:

Stored size: 1.5 KB

Contents

require 'ffi'

module Win32
  class TaskScheduler
    module Helper
      extend FFI::Library

      FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200
      FORMAT_MESSAGE_FROM_SYSTEM    = 0x00001000
      FORMAT_MESSAGE_MAX_WIDTH_MASK = 0x000000FF

      ffi_lib :kernel32, :advapi32

      attach_function :FormatMessage, :FormatMessageA,
      [:ulong, :pointer, :ulong, :ulong, :pointer, :ulong, :pointer], :ulong

      attach_function :ConvertStringSidToSidW, [ :pointer, :pointer ], :bool
      attach_function :LookupAccountSidW, [ :pointer, :pointer, :pointer, :pointer, :pointer, :pointer, :pointer ], :bool
      attach_function :LocalFree, [ :pointer ], :pointer

      def win_error(function, err=FFI.errno)
        err_msg = ''
        flags = FORMAT_MESSAGE_IGNORE_INSERTS |
          FORMAT_MESSAGE_FROM_SYSTEM |
          FORMAT_MESSAGE_MAX_WIDTH_MASK

        # 0x0409 == MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)
        # We use English for errors because Ruby uses English for errors.

        FFI::MemoryPointer.new(:char, 1024) do |buf|
          len = FormatMessage(flags, nil, err , 0x0409, buf, buf.size, nil)
          err_msg = function + ': ' + buf.read_string(len).strip
        end

        err_msg
      end

      def ole_error(function, err)
        regex = /OLE error code:(.*?)\sin/
        match = regex.match(err.to_s)

        if match
          error = match.captures.first.hex
          win_error(function, error)
        else
          "#{function}: #{err.to_s}"
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
win32-taskscheduler-2.0.1 lib/win32/taskscheduler/helper.rb
win32-taskscheduler-2.0.0 lib/win32/taskscheduler/helper.rb