winevt_c 0.10.0 → 0.10.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 87d082b15698183b841886fbdffe603679006050fc91c7ea6043bf5987275e3f
4
- data.tar.gz: ab529bd44369e0c256263aee77ba416a42469bbaf71b0de9f523db81921bbfef
3
+ metadata.gz: 80b819f8d9870a7c09c90b34ca7750ddf913df9056369cc8a34b6c8883c13205
4
+ data.tar.gz: 49c44fb51e996fa70daae1ee8cfb4e12629624dd0d03f261b9680aa241326abf
5
5
  SHA512:
6
- metadata.gz: a5b728bc6422d8fc1a17ab10fbbc6ad10aa673b3faec5b035269826859ef4e14bd63def67a69618c21a2e4d1a7951d2d2f2881676ee049348b996bb706b21ec5
7
- data.tar.gz: '0483519d86d5abd1fe5672ee124fdadf839bd9f9a50b41cb1aaac37dd886154dc0a4e5af4d6901c4cc6f2da9e99ad6e98e82cfb8cf6630a69dd3dda0d127ddfa'
6
+ metadata.gz: 40985cde59f0eb8941fa07998a3461d20a02736c85765484778069790517519e273f82b75ee87499fb40f3b1018940de1ed67e31f1fc7e481b2d80f5dbcc617c
7
+ data.tar.gz: 862e1aa6620ec9763a82863ac5d74af158f13cb37637ea53434cf66f89e5ca039e16c52b9849a4f91b3326822ec2015cc6c5b298990259c0d8703b31d497e3d9
@@ -8,7 +8,7 @@ jobs:
8
8
  strategy:
9
9
  fail-fast: false
10
10
  matrix:
11
- ruby: [ '2.4', '2.5', '2.6', '2.7', '3.0' ]
11
+ ruby: [ '3.0', '3.1', '3.2' ]
12
12
  os:
13
13
  - ubuntu-latest
14
14
  name: Ruby ${{ matrix.ruby }} building fat gem testing on ${{ matrix.os }}
data/ext/winevt/winevt.c CHANGED
@@ -5,7 +5,9 @@ VALUE rb_cQuery;
5
5
  VALUE rb_cEventLog;
6
6
  VALUE rb_cSubscribe;
7
7
  VALUE rb_eWinevtQueryError;
8
+ VALUE rb_eChannelNotFoundError;
8
9
  VALUE rb_eRemoteHandlerError;
10
+ VALUE rb_eSubscribeHandlerError;
9
11
 
10
12
  static ID id_call;
11
13
 
@@ -17,7 +19,9 @@ Init_winevt(void)
17
19
  rb_cQuery = rb_define_class_under(rb_cEventLog, "Query", rb_cObject);
18
20
  rb_cSubscribe = rb_define_class_under(rb_cEventLog, "Subscribe", rb_cObject);
19
21
  rb_eWinevtQueryError = rb_define_class_under(rb_cQuery, "Error", rb_eStandardError);
22
+ rb_eChannelNotFoundError = rb_define_class_under(rb_cEventLog, "ChannelNotFoundError", rb_eStandardError);
20
23
  rb_eRemoteHandlerError = rb_define_class_under(rb_cSubscribe, "RemoteHandlerError", rb_eRuntimeError);
24
+ rb_eSubscribeHandlerError = rb_define_class_under(rb_cSubscribe, "SubscribeHandlerError", rb_eRuntimeError);
21
25
 
22
26
  Init_winevt_channel(rb_cEventLog);
23
27
  Init_winevt_bookmark(rb_cEventLog);
@@ -37,7 +37,8 @@ VALUE wstr_to_rb_str(UINT cp, const WCHAR* wstr, int clen);
37
37
  #if defined(__cplusplus)
38
38
  [[ noreturn ]]
39
39
  #endif /* __cplusplus */
40
- void raise_system_error(VALUE error, DWORD errorCode);
40
+ void raise_system_error(VALUE error, DWORD errorCode);
41
+ void raise_channel_not_found_error(VALUE channelPath);
41
42
  VALUE render_to_rb_str(EVT_HANDLE handle, DWORD flags);
42
43
  EVT_HANDLE connect_to_remote(LPWSTR computerName, LPWSTR domain,
43
44
  LPWSTR username, LPWSTR password,
@@ -58,7 +59,9 @@ extern VALUE rb_cChannel;
58
59
  extern VALUE rb_cBookmark;
59
60
  extern VALUE rb_cSubscribe;
60
61
  extern VALUE rb_eWinevtQueryError;
62
+ extern VALUE rb_eChannelNotFoundError;
61
63
  extern VALUE rb_eRemoteHandlerError;
64
+ extern VALUE rb_eSubscribeHandlerError;
62
65
  extern VALUE rb_cLocale;
63
66
  extern VALUE rb_cSession;
64
67
 
@@ -131,6 +131,9 @@ rb_winevt_query_initialize(VALUE argc, VALUE *argv, VALUE self)
131
131
  hRemoteHandle, evtChannel, evtXPath, EvtQueryChannelPath | EvtQueryTolerateQueryErrors);
132
132
  err = GetLastError();
133
133
  if (err != ERROR_SUCCESS) {
134
+ if (err == ERROR_EVT_CHANNEL_NOT_FOUND) {
135
+ raise_channel_not_found_error(channel);
136
+ }
134
137
  raise_system_error(rb_eRuntimeError, err);
135
138
  }
136
139
  winevtQuery->offset = 0L;
@@ -174,7 +174,7 @@ rb_winevt_subscribe_subscribe(int argc, VALUE* argv, VALUE self)
174
174
  struct WinevtSession* winevtSession;
175
175
  struct WinevtSubscribe* winevtSubscribe;
176
176
 
177
- hSignalEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
177
+ hSignalEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
178
178
 
179
179
  TypedData_Get_Struct(
180
180
  self, struct WinevtSubscribe, &rb_winevt_subscribe_type, winevtSubscribe);
@@ -248,10 +248,17 @@ rb_winevt_subscribe_subscribe(int argc, VALUE* argv, VALUE self)
248
248
  if (hSignalEvent != NULL) {
249
249
  CloseHandle(hSignalEvent);
250
250
  }
251
+
251
252
  if (rb_obj_is_kind_of(rb_session, rb_cSession)) {
252
253
  rb_raise(rb_eRemoteHandlerError, "Remoting subscription is not working. errCode: %ld\n", status);
253
- } else {
254
+ }
255
+
256
+ switch (status) {
257
+ case ERROR_EVT_CHANNEL_NOT_FOUND:
258
+ raise_channel_not_found_error(rb_path);
259
+ default:
254
260
  raise_system_error(rb_eWinevtQueryError, status);
261
+ break;
255
262
  }
256
263
  }
257
264
 
@@ -334,6 +341,8 @@ rb_winevt_subscribe_next(VALUE self)
334
341
  EVT_HANDLE hEvents[SUBSCRIBE_ARRAY_SIZE];
335
342
  ULONG count = 0;
336
343
  DWORD status = ERROR_SUCCESS;
344
+ DWORD dwWait = 0;
345
+
337
346
  struct WinevtSubscribe* winevtSubscribe;
338
347
 
339
348
  TypedData_Get_Struct(
@@ -348,6 +357,23 @@ rb_winevt_subscribe_next(VALUE self)
348
357
  return Qfalse;
349
358
  }
350
359
 
360
+ /* If a signalEvent notifies whether a state of processed event(s)
361
+ * is existing or not.
362
+ * For checking for a result of WaitForSingleObject,
363
+ * we need to raise SubscribeHandlerError exception when
364
+ * WAIT_FAILED is detected for further investigations.
365
+ * Note that we don't need to wait explicitly here.
366
+ * Because this function is inside of each enumerator.
367
+ * So, WaitForSingleObject should return immediately and should be
368
+ * processed with the latter each loops if there is no more items.
369
+ * Just intended to check that there is no errors here. */
370
+ dwWait = WaitForSingleObject(winevtSubscribe->signalEvent, 0);
371
+ if (dwWait == WAIT_FAILED) {
372
+ raise_system_error(rb_eSubscribeHandlerError, GetLastError());
373
+ } else if (dwWait != WAIT_OBJECT_0) {
374
+ return Qfalse;
375
+ }
376
+
351
377
  if (!EvtNext(winevtSubscribe->subscription,
352
378
  SUBSCRIBE_ARRAY_SIZE,
353
379
  hEvents,
@@ -361,6 +387,8 @@ rb_winevt_subscribe_next(VALUE self)
361
387
  if (ERROR_NO_MORE_ITEMS != status) {
362
388
  return Qfalse;
363
389
  }
390
+
391
+ ResetEvent(winevtSubscribe->signalEvent);
364
392
  }
365
393
 
366
394
  if (status == ERROR_SUCCESS) {
@@ -56,6 +56,16 @@ raise_system_error(VALUE error, DWORD errorCode)
56
56
  #pragma GCC diagnostic pop
57
57
  }
58
58
 
59
+ void
60
+ raise_channel_not_found_error(VALUE channelPath)
61
+ {
62
+ #pragma GCC diagnostic push
63
+ #pragma GCC diagnostic ignored "-Wformat="
64
+ #pragma GCC diagnostic ignored "-Wformat-extra-args"
65
+ rb_raise(rb_eChannelNotFoundError, "Channel Not Found: %" PRIsVALUE, channelPath);
66
+ #pragma GCC diagnostic pop
67
+ }
68
+
59
69
  VALUE
60
70
  render_to_rb_str(EVT_HANDLE handle, DWORD flags)
61
71
  {
@@ -1,3 +1,3 @@
1
1
  module Winevt
2
- VERSION = "0.10.0"
2
+ VERSION = "0.10.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: winevt_c
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.10.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hiroshi Hatake
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-14 00:00:00.000000000 Z
11
+ date: 2024-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler