def self.add_event_source(args)
raise TypeError unless args.is_a?(Hash)
hkey = [0].pack('L')
valid_keys = %w/source key_name category_count event_message_file
category_message_file supported_types/
key_base = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\"
hash = {
'source' => 'Application',
'supported_types' => ERROR | WARN | INFO
}
args.each{ |key, val|
key = key.to_s.downcase
unless valid_keys.include?(key)
raise ArgumentError, "invalid key '#{key}'"
end
hash[key] = val
}
unless hash['key_name']
raise Error, 'no event_type specified'
end
key = key_base << hash['source'] << "\\" << hash['key_name']
if RegCreateKey(HKEY_LOCAL_MACHINE, key, hkey) != ERROR_SUCCESS
error = 'RegCreateKey() failed: ' + get_last_error
raise Error, error
end
hkey = hkey.unpack('L')[0]
if hash['category_count']
data = [hash['category_count']].pack('L')
rv = RegSetValueEx(
hkey,
'CategoryCount',
0,
REG_DWORD,
data,
data.size
)
if rv != ERROR_SUCCESS
error = 'RegSetValueEx() failed: ', get_last_error
RegCloseKey(hkey)
raise Error, error
end
end
if hash['category_message_file']
data = File.expand_path(hash['category_message_file'])
rv = RegSetValueEx(
hkey,
'CategoryMessageFile',
0,
REG_EXPAND_SZ,
data,
data.size
)
if rv != ERROR_SUCCESS
error = 'RegSetValueEx() failed: ', get_last_error
RegCloseKey(hkey)
raise Error, error
end
end
if hash['event_message_file']
data = File.expand_path(hash['event_message_file'])
rv = RegSetValueEx(
hkey,
'EventMessageFile',
0,
REG_EXPAND_SZ,
data,
data.size
)
if rv != ERROR_SUCCESS
error = 'RegSetValueEx() failed: ', get_last_error
RegCloseKey(hkey)
raise Error, error
end
end
data = [hash['supported_types']].pack('L')
rv = RegSetValueEx(
hkey,
'TypesSupported',
0,
REG_DWORD,
data,
data.size
)
if rv != ERROR_SUCCESS
error = 'RegSetValueEx() failed: ', get_last_error
RegCloseKey(hkey)
raise Error, error
end
RegCloseKey(hkey)
self
end