win32-eventlog 0.4.8 → 0.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +9 -0
- data/README +5 -1
- data/lib/win32/eventlog.rb +255 -222
- data/win32-eventlog.gemspec +1 -1
- metadata +4 -5
data/CHANGES
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
= 0.4.9 - 7-Sep-2008
|
2
|
+
* The private get_description method, which is used internally to read the
|
3
|
+
event log, has been updated to work with 64 bit Windows. The changes needed
|
4
|
+
for this require a more recent windows-pr library, i.e. 0.9.2 or later.
|
5
|
+
* Now properly separates the string inserts and description in the private
|
6
|
+
method get_last_event. This fixes the description and string_insert
|
7
|
+
properties for both the EventLog#tail and EventLog#notify_change methods.
|
8
|
+
* Some internal refactoring to use begin/ensure where appropriate.
|
9
|
+
|
1
10
|
= 0.4.8 - 17-May-2008
|
2
11
|
* Fixed in a bug in the EventLog#read method where a log entry requiring
|
3
12
|
over 64k would fail and spiral into an infinite loop. Thanks go to
|
data/README
CHANGED
@@ -50,7 +50,11 @@
|
|
50
50
|
them somewhere on your system.
|
51
51
|
|
52
52
|
= Known Issues
|
53
|
-
|
53
|
+
Not all event descriptions from Windows Vista/2008 or later will necessarily
|
54
|
+
be picked up because of a new event logging format and api that Microsoft
|
55
|
+
has introduced. This will be addressed in the next major release.
|
56
|
+
|
57
|
+
Please file any bug reports on the project page at
|
54
58
|
http://www.rubyforge.org/projects/win32utils.
|
55
59
|
|
56
60
|
= License
|
data/lib/win32/eventlog.rb
CHANGED
@@ -37,7 +37,8 @@ module Win32
|
|
37
37
|
extend Windows::Error
|
38
38
|
extend Windows::Registry
|
39
39
|
|
40
|
-
|
40
|
+
# The version of the win32-eventlog library
|
41
|
+
VERSION = '0.4.9'
|
41
42
|
|
42
43
|
# Aliased read flags
|
43
44
|
FORWARDS_READ = EVENTLOG_FORWARDS_READ
|
@@ -170,8 +171,15 @@ module Win32
|
|
170
171
|
def self.add_event_source(args)
|
171
172
|
raise TypeError unless args.is_a?(Hash)
|
172
173
|
|
173
|
-
valid_keys = %w/
|
174
|
-
|
174
|
+
valid_keys = %w/
|
175
|
+
source
|
176
|
+
key_name
|
177
|
+
category_count
|
178
|
+
event_message_file
|
179
|
+
category_message_file
|
180
|
+
parameter_message_file
|
181
|
+
supported_types
|
182
|
+
/
|
175
183
|
|
176
184
|
key_base = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\"
|
177
185
|
|
@@ -220,140 +228,139 @@ module Win32
|
|
220
228
|
hkey = hkey.unpack('L')[0]
|
221
229
|
data = "%SystemRoot%\\System32\\config\\#{hash['source']}.evt"
|
222
230
|
|
223
|
-
|
224
|
-
hkey,
|
225
|
-
'File',
|
226
|
-
0,
|
227
|
-
REG_EXPAND_SZ,
|
228
|
-
data,
|
229
|
-
data.size
|
230
|
-
)
|
231
|
-
|
232
|
-
if rv != ERROR_SUCCESS
|
233
|
-
error = 'RegSetValueEx() failed: ', get_last_error
|
234
|
-
RegCloseKey(hkey)
|
235
|
-
raise Error, error
|
236
|
-
end
|
237
|
-
|
238
|
-
RegCloseKey(hkey)
|
239
|
-
|
240
|
-
hkey = [0].pack('L')
|
241
|
-
key = key_base << hash['source'] << "\\" << hash['key_name']
|
242
|
-
|
243
|
-
disposition = [0].pack('L')
|
244
|
-
|
245
|
-
rv = RegCreateKeyEx(
|
246
|
-
HKEY_LOCAL_MACHINE,
|
247
|
-
key,
|
248
|
-
0,
|
249
|
-
nil,
|
250
|
-
REG_OPTION_NON_VOLATILE,
|
251
|
-
KEY_WRITE,
|
252
|
-
nil,
|
253
|
-
hkey,
|
254
|
-
disposition
|
255
|
-
)
|
256
|
-
|
257
|
-
if rv != ERROR_SUCCESS
|
258
|
-
raise Error, 'RegCreateKeyEx() failed: ' + get_last_error
|
259
|
-
end
|
260
|
-
|
261
|
-
hkey = hkey.unpack('L')[0]
|
262
|
-
|
263
|
-
if hash['category_count']
|
264
|
-
data = [hash['category_count']].pack('L')
|
265
|
-
|
231
|
+
begin
|
266
232
|
rv = RegSetValueEx(
|
267
233
|
hkey,
|
268
|
-
'
|
234
|
+
'File',
|
269
235
|
0,
|
270
|
-
|
236
|
+
REG_EXPAND_SZ,
|
271
237
|
data,
|
272
238
|
data.size
|
273
239
|
)
|
274
|
-
|
240
|
+
|
275
241
|
if rv != ERROR_SUCCESS
|
276
|
-
error = 'RegSetValueEx() failed: '
|
277
|
-
RegCloseKey(hkey)
|
242
|
+
error = 'RegSetValueEx() failed: ', get_last_error
|
278
243
|
raise Error, error
|
279
244
|
end
|
245
|
+
ensure
|
246
|
+
RegCloseKey(hkey)
|
280
247
|
end
|
281
248
|
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
249
|
+
hkey = [0].pack('L')
|
250
|
+
key = key_base << hash['source'] << "\\" << hash['key_name']
|
251
|
+
|
252
|
+
disposition = [0].pack('L')
|
253
|
+
|
254
|
+
begin
|
255
|
+
rv = RegCreateKeyEx(
|
256
|
+
HKEY_LOCAL_MACHINE,
|
257
|
+
key,
|
288
258
|
0,
|
289
|
-
|
290
|
-
|
291
|
-
|
259
|
+
nil,
|
260
|
+
REG_OPTION_NON_VOLATILE,
|
261
|
+
KEY_WRITE,
|
262
|
+
nil,
|
263
|
+
hkey,
|
264
|
+
disposition
|
292
265
|
)
|
293
|
-
|
266
|
+
|
294
267
|
if rv != ERROR_SUCCESS
|
295
|
-
|
296
|
-
RegCloseKey(hkey)
|
297
|
-
raise Error, error
|
268
|
+
raise Error, 'RegCreateKeyEx() failed: ' + get_last_error
|
298
269
|
end
|
299
|
-
end
|
300
|
-
|
301
|
-
if hash['event_message_file']
|
302
|
-
data = File.expand_path(hash['event_message_file'])
|
303
270
|
|
304
|
-
|
305
|
-
hkey,
|
306
|
-
'EventMessageFile',
|
307
|
-
0,
|
308
|
-
REG_EXPAND_SZ,
|
309
|
-
data,
|
310
|
-
data.size
|
311
|
-
)
|
271
|
+
hkey = hkey.unpack('L')[0]
|
312
272
|
|
313
|
-
if
|
314
|
-
|
315
|
-
|
316
|
-
|
273
|
+
if hash['category_count']
|
274
|
+
data = [hash['category_count']].pack('L')
|
275
|
+
|
276
|
+
rv = RegSetValueEx(
|
277
|
+
hkey,
|
278
|
+
'CategoryCount',
|
279
|
+
0,
|
280
|
+
REG_DWORD,
|
281
|
+
data,
|
282
|
+
data.size
|
283
|
+
)
|
284
|
+
|
285
|
+
if rv != ERROR_SUCCESS
|
286
|
+
error = 'RegSetValueEx() failed: ' + get_last_error
|
287
|
+
raise Error, error
|
288
|
+
end
|
317
289
|
end
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
290
|
+
|
291
|
+
if hash['category_message_file']
|
292
|
+
data = File.expand_path(hash['category_message_file'])
|
293
|
+
|
294
|
+
rv = RegSetValueEx(
|
295
|
+
hkey,
|
296
|
+
'CategoryMessageFile',
|
297
|
+
0,
|
298
|
+
REG_EXPAND_SZ,
|
299
|
+
data,
|
300
|
+
data.size
|
301
|
+
)
|
302
|
+
|
303
|
+
if rv != ERROR_SUCCESS
|
304
|
+
error = 'RegSetValueEx() failed: ' + get_last_error
|
305
|
+
raise Error, error
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
if hash['event_message_file']
|
310
|
+
data = File.expand_path(hash['event_message_file'])
|
311
|
+
|
312
|
+
rv = RegSetValueEx(
|
313
|
+
hkey,
|
314
|
+
'EventMessageFile',
|
315
|
+
0,
|
316
|
+
REG_EXPAND_SZ,
|
317
|
+
data,
|
318
|
+
data.size
|
319
|
+
)
|
320
|
+
|
321
|
+
if rv != ERROR_SUCCESS
|
322
|
+
error = 'RegSetValueEx() failed: ' + get_last_error
|
323
|
+
raise Error, error
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
if hash['parameter_message_file']
|
328
|
+
data = File.expand_path(hash['parameter_message_file'])
|
329
|
+
|
330
|
+
rv = RegSetValueEx(
|
331
|
+
hkey,
|
332
|
+
'ParameterMessageFile',
|
333
|
+
0,
|
334
|
+
REG_EXPAND_SZ,
|
335
|
+
data,
|
336
|
+
data.size
|
337
|
+
)
|
338
|
+
|
339
|
+
if rv != ERROR_SUCCESS
|
340
|
+
error = 'RegSetValueEx() failed: ' + get_last_error
|
341
|
+
raise Error, error
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
data = [hash['supported_types']].pack('L')
|
346
|
+
|
323
347
|
rv = RegSetValueEx(
|
324
348
|
hkey,
|
325
|
-
'
|
349
|
+
'TypesSupported',
|
326
350
|
0,
|
327
|
-
|
351
|
+
REG_DWORD,
|
328
352
|
data,
|
329
353
|
data.size
|
330
354
|
)
|
331
|
-
|
355
|
+
|
332
356
|
if rv != ERROR_SUCCESS
|
333
357
|
error = 'RegSetValueEx() failed: ' + get_last_error
|
334
|
-
RegCloseKey(hkey)
|
335
358
|
raise Error, error
|
336
359
|
end
|
337
|
-
|
338
|
-
|
339
|
-
data = [hash['supported_types']].pack('L')
|
340
|
-
rv = RegSetValueEx(
|
341
|
-
hkey,
|
342
|
-
'TypesSupported',
|
343
|
-
0,
|
344
|
-
REG_DWORD,
|
345
|
-
data,
|
346
|
-
data.size
|
347
|
-
)
|
348
|
-
|
349
|
-
if rv != ERROR_SUCCESS
|
350
|
-
error = 'RegSetValueEx() failed: ' + get_last_error
|
360
|
+
ensure
|
351
361
|
RegCloseKey(hkey)
|
352
|
-
raise Error, error
|
353
362
|
end
|
354
363
|
|
355
|
-
RegCloseKey(hkey)
|
356
|
-
|
357
364
|
disposition.unpack('L')[0]
|
358
365
|
end
|
359
366
|
|
@@ -462,16 +469,18 @@ module Win32
|
|
462
469
|
|
463
470
|
wait_result = WaitForSingleObject(event, INFINITE)
|
464
471
|
|
465
|
-
|
466
|
-
|
472
|
+
begin
|
473
|
+
if wait_result == WAIT_FAILED
|
474
|
+
error = 'WaitForSingleObject() failed: ' + get_last_error
|
475
|
+
raise Error, error
|
476
|
+
else
|
477
|
+
last = read_last_event
|
478
|
+
block.call(last)
|
479
|
+
end
|
480
|
+
ensure
|
467
481
|
CloseHandle(event)
|
468
|
-
raise Error, error
|
469
|
-
else
|
470
|
-
last = read_last_event
|
471
|
-
block.call(last)
|
472
482
|
end
|
473
483
|
|
474
|
-
CloseHandle(event)
|
475
484
|
self
|
476
485
|
end
|
477
486
|
|
@@ -743,11 +752,11 @@ module Win32
|
|
743
752
|
lkey = hkey.unpack('L').first
|
744
753
|
end
|
745
754
|
|
746
|
-
event_source
|
747
|
-
computer
|
748
|
-
event_type
|
749
|
-
user
|
750
|
-
desc
|
755
|
+
event_source = buf[56..-1].nstrip
|
756
|
+
computer = buf[56 + event_source.length + 1..-1].nstrip
|
757
|
+
event_type = get_event_type(buf[24,2].unpack('S')[0])
|
758
|
+
user = get_user(buf)
|
759
|
+
strings, desc = get_description(buf, event_source, lkey)
|
751
760
|
|
752
761
|
struct = EventLogStruct.new
|
753
762
|
struct.source = event_source
|
@@ -759,6 +768,7 @@ module Win32
|
|
759
768
|
struct.event_type = event_type
|
760
769
|
struct.user = user
|
761
770
|
struct.category = buf[28,2].unpack('S')[0]
|
771
|
+
struct.string_inserts = strings
|
762
772
|
struct.description = desc
|
763
773
|
|
764
774
|
struct
|
@@ -823,123 +833,146 @@ module Win32
|
|
823
833
|
key = BASE_KEY + "#{@source}\\#{event_source}"
|
824
834
|
buf = 0.chr * 8192
|
825
835
|
va_list = va_list0 = (num == 0) ? [] : str.unpack('Z*' * num)
|
836
|
+
|
837
|
+
begin
|
838
|
+
if defined? Wow64DisableWow64FsRedirection
|
839
|
+
old_wow_val = 0.chr * 4
|
840
|
+
Wow64DisableWow64FsRedirection(old_wow_val)
|
841
|
+
end
|
826
842
|
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
0,
|
847
|
-
DONT_RESOLVE_DLL_REFERENCES
|
848
|
-
)
|
849
|
-
|
850
|
-
if hmodule != 0
|
851
|
-
FormatMessage(
|
852
|
-
FORMAT_MESSAGE_FROM_HMODULE |
|
853
|
-
FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
854
|
-
hmodule,
|
855
|
-
x.first.to_i,
|
843
|
+
if RegOpenKeyEx(lkey, key, 0, KEY_READ, hkey) == 0
|
844
|
+
value = 'ParameterMessageFile'
|
845
|
+
file = 0.chr * MAX_SIZE
|
846
|
+
hkey = hkey.unpack('L')[0]
|
847
|
+
size = [ file.length].pack('L')
|
848
|
+
|
849
|
+
if RegQueryValueEx(hkey, value, 0, 0, file, size) == 0
|
850
|
+
file = file.nstrip
|
851
|
+
exe = 0.chr * MAX_SIZE
|
852
|
+
ExpandEnvironmentStrings(file, exe, exe.size)
|
853
|
+
exe = exe.nstrip
|
854
|
+
|
855
|
+
va_list = va_list0.map{ |v|
|
856
|
+
va = v
|
857
|
+
|
858
|
+
v.scan(/%%(\d+)/).uniq.each{ |x|
|
859
|
+
exe.split(';').each{ |file|
|
860
|
+
hmodule = LoadLibraryEx(
|
861
|
+
file,
|
856
862
|
0,
|
857
|
-
|
858
|
-
|
859
|
-
v
|
863
|
+
DONT_RESOLVE_DLL_REFERENCES |
|
864
|
+
LOAD_LIBRARY_AS_DATAFILE
|
860
865
|
)
|
861
|
-
|
862
|
-
|
863
|
-
|
866
|
+
|
867
|
+
if hmodule != 0
|
868
|
+
FormatMessage(
|
869
|
+
FORMAT_MESSAGE_FROM_HMODULE |
|
870
|
+
FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
871
|
+
hmodule,
|
872
|
+
x.first.to_i,
|
873
|
+
0,
|
874
|
+
buf,
|
875
|
+
buf.size,
|
876
|
+
v
|
877
|
+
)
|
878
|
+
FreeLibrary(hmodule)
|
879
|
+
break if buf.nstrip != ""
|
880
|
+
end
|
881
|
+
}
|
882
|
+
va = va.gsub("%%#{x.first}", buf.nstrip)
|
864
883
|
}
|
865
|
-
va
|
884
|
+
va
|
866
885
|
}
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
file = 0.chr * MAX_SIZE
|
873
|
-
size = [file.length].pack('L')
|
874
|
-
|
875
|
-
if RegQueryValueEx(hkey, value, 0, 0, file, size) == 0
|
876
|
-
file = file.nstrip
|
877
|
-
exe = 0.chr * MAX_SIZE
|
886
|
+
end
|
887
|
+
|
888
|
+
value = 'EventMessageFile'
|
889
|
+
file = 0.chr * MAX_SIZE
|
890
|
+
size = [file.length].pack('L')
|
878
891
|
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
FORMAT_MESSAGE_IGNORE_INSERTS,
|
891
|
-
hmodule,
|
892
|
-
event_id,
|
892
|
+
if RegQueryValueEx(hkey, value, 0, 0, file, size) == 0
|
893
|
+
file = file.nstrip
|
894
|
+
exe = 0.chr * MAX_SIZE
|
895
|
+
|
896
|
+
ExpandEnvironmentStrings(file, exe, exe.size)
|
897
|
+
exe = exe.nstrip
|
898
|
+
|
899
|
+
# Try to retrieve message *without* expanding the inserts yet
|
900
|
+
exe.split(';').each{ |file|
|
901
|
+
hmodule = LoadLibraryEx(
|
902
|
+
file,
|
893
903
|
0,
|
894
|
-
|
895
|
-
buf.size,
|
896
|
-
nil
|
904
|
+
DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE
|
897
905
|
)
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
exe.split(';').each{ |file|
|
921
|
-
hmodule = LoadLibraryEx(file, 0, DONT_RESOLVE_DLL_REFERENCES)
|
922
|
-
event_id = rec[20,4].unpack('L')[0]
|
906
|
+
|
907
|
+
event_id = rec[20,4].unpack('L')[0]
|
908
|
+
|
909
|
+
if hmodule != 0
|
910
|
+
FormatMessage(
|
911
|
+
FORMAT_MESSAGE_FROM_HMODULE |
|
912
|
+
FORMAT_MESSAGE_IGNORE_INSERTS,
|
913
|
+
hmodule,
|
914
|
+
event_id,
|
915
|
+
0,
|
916
|
+
buf,
|
917
|
+
buf.size,
|
918
|
+
nil
|
919
|
+
)
|
920
|
+
|
921
|
+
FreeLibrary(hmodule)
|
922
|
+
break if buf.nstrip != "" # All messages read
|
923
|
+
end
|
924
|
+
}
|
925
|
+
|
926
|
+
buf = 0.chr * 8192 # Reset the buffer
|
923
927
|
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
928
|
+
# Determine higest %n insert number
|
929
|
+
max_insert = [num, buf.nstrip.scan(/%(\d+)/).map{ |x| x[0].to_i }.max].compact.max
|
930
|
+
|
931
|
+
# Insert dummy strings not provided by caller
|
932
|
+
((num+1)..(max_insert)).each{ |x| va_list.push("%#{x}") }
|
933
|
+
|
934
|
+
if num == 0
|
935
|
+
va_list_ptr = 0.chr * 4
|
936
|
+
else
|
937
|
+
va_list_ptr = va_list.map{ |x|
|
938
|
+
[x + 0.chr].pack('P').unpack('L')[0]
|
939
|
+
}.pack('L*')
|
940
|
+
end
|
941
|
+
|
942
|
+
exe.split(';').each{ |file|
|
943
|
+
hmodule = LoadLibraryEx(
|
944
|
+
file,
|
930
945
|
0,
|
931
|
-
|
932
|
-
buf.size,
|
933
|
-
va_list_ptr
|
946
|
+
DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE
|
934
947
|
)
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
948
|
+
|
949
|
+
event_id = rec[20,4].unpack('L')[0]
|
950
|
+
|
951
|
+
if hmodule != 0
|
952
|
+
FormatMessage(
|
953
|
+
FORMAT_MESSAGE_FROM_HMODULE |
|
954
|
+
FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
955
|
+
hmodule,
|
956
|
+
event_id,
|
957
|
+
0,
|
958
|
+
buf,
|
959
|
+
buf.size,
|
960
|
+
va_list_ptr
|
961
|
+
)
|
962
|
+
|
963
|
+
FreeLibrary(hmodule)
|
964
|
+
break if buf.nstrip != "" # All messages read
|
965
|
+
end
|
966
|
+
}
|
967
|
+
end
|
968
|
+
RegCloseKey(hkey)
|
969
|
+
end
|
970
|
+
ensure
|
971
|
+
if defined? Wow64RevertWow64FsRedirection
|
972
|
+
Wow64RevertWow64FsRedirection(old_wow_val.unpack('L')[0])
|
940
973
|
end
|
941
|
-
RegCloseKey(hkey)
|
942
974
|
end
|
975
|
+
|
943
976
|
[va_list0, buf.strip]
|
944
977
|
end
|
945
978
|
end
|
data/win32-eventlog.gemspec
CHANGED
@@ -2,7 +2,7 @@ require "rubygems"
|
|
2
2
|
|
3
3
|
spec = Gem::Specification.new do |gem|
|
4
4
|
gem.name = "win32-eventlog"
|
5
|
-
gem.version = "0.4.
|
5
|
+
gem.version = "0.4.9"
|
6
6
|
gem.author = "Daniel J. Berger"
|
7
7
|
gem.email = "djberg96@gmail.com"
|
8
8
|
gem.homepage = "http://www.rubyforge.org/projects/win32utils"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: win32-eventlog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Berger
|
@@ -9,11 +9,12 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-09-07 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: windows-pr
|
17
|
+
type: :runtime
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
@@ -35,13 +36,11 @@ extra_rdoc_files:
|
|
35
36
|
files:
|
36
37
|
- lib/win32/eventlog.rb
|
37
38
|
- lib/win32/mc.rb
|
38
|
-
- test/CVS
|
39
39
|
- test/foo.mc
|
40
40
|
- test/tc_eventlog.rb
|
41
41
|
- test/tc_mc.rb
|
42
42
|
- test/ts_all.rb
|
43
43
|
- CHANGES
|
44
|
-
- CVS
|
45
44
|
- doc
|
46
45
|
- examples
|
47
46
|
- lib
|
@@ -74,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
73
|
requirements: []
|
75
74
|
|
76
75
|
rubyforge_project:
|
77
|
-
rubygems_version: 1.
|
76
|
+
rubygems_version: 1.2.0
|
78
77
|
signing_key:
|
79
78
|
specification_version: 2
|
80
79
|
summary: Interface for the MS Windows Event Log.
|