# File lib/win32/eventlog.rb, line 165
      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\\"

         # Default values
         hash = {
            'source'          => 'Application',
            'supported_types' => ERROR | WARN | INFO
         }
         
         # Validate the keys, and convert symbols and case to lowercase strings.     
         args.each{ |key, val|
            key = key.to_s.downcase
            unless valid_keys.include?(key)
               raise ArgumentError, "invalid key '#{key}'"
            end
            hash[key] = val
         }
         
         # The key_name must be specified
         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