winevt_c 0.4.1-x86-mingw32 → 0.4.2-x86-mingw32

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: 9524469dfab709e5ccab74919030550448efb1565a53a5841cfb76c0d611d9f5
4
- data.tar.gz: 5c6ec4637fa2e018f0673518defef25cc9d5a32fac0bfa624c27ed71c624d8b4
3
+ metadata.gz: d2142e2c4d124e610434fa0103a8477e51c675d9fc561b02578671cc6fc98826
4
+ data.tar.gz: 3c5f32bbbeaa63746637a772299b42da1e54700185eeaee68d5404bc87c4538f
5
5
  SHA512:
6
- metadata.gz: 189388df964b905a4ea276a5704b7deda991f35b8f4ada4591725ec99a50929545a68e4b69c95210f9ef621ef9bc420397de33ad5e99ccc4ef77becf56c15190
7
- data.tar.gz: 567defa57d64a8941312641cae88a8672c1218739aa0b281d971eb694f6fafebba893faac22700f4c87bf34950d5c048527627393fe605ae07915d6168e7e0f4
6
+ metadata.gz: 7b5554ed7598743cfc42bff9d112e69308f1e6e263dbdaeffd21de64f9530a4a9cd58f502a2d1c1e972684c7139680825f34c06a72d857d48835e88fcfa3e489
7
+ data.tar.gz: 97c98e76a6f86156f6bc852405e9ec3e05135ebadd01a38a498d75bb5208fc57524e61606a0d81d76576b518571bc48279c380b75e31358693c4804ec8739e72
@@ -17,6 +17,7 @@ have_library("ole32")
17
17
 
18
18
  $LDFLAGS << " -lwevtapi -ladvapi32 -lole32"
19
19
  $CFLAGS << " -std=c99 -fPIC -fms-extensions "
20
+ $CXXFLAGS << " -std=c++11 -fPIC -fms-extensions "
20
21
  # $CFLAGS << " -g -O0"
21
22
 
22
23
  create_makefile("winevt/winevt")
@@ -90,6 +90,8 @@ rb_winevt_bookmark_render(VALUE self)
90
90
 
91
91
  utf8str = rb_utf8_str_new_cstr(result);
92
92
  free_allocated_mbstr(result);
93
+ if (wResult != NULL)
94
+ free(wResult);
93
95
 
94
96
  return utf8str;
95
97
  }
@@ -21,12 +21,20 @@
21
21
  #define EventBookMark(object) ((struct WinevtBookmark *)DATA_PTR(object))
22
22
  #define EventChannel(object) ((struct WinevtChannel *)DATA_PTR(object))
23
23
 
24
+ #ifdef __cplusplus
25
+ extern "C" {
26
+ #endif /* __cplusplus */
27
+
24
28
  char* wstr_to_mbstr(UINT cp, const WCHAR *wstr, int clen);
25
29
  void free_allocated_mbstr(const char* str);
26
30
  WCHAR* render_event(EVT_HANDLE handle, DWORD flags);
27
31
  WCHAR* get_description(EVT_HANDLE handle);
28
32
  VALUE get_values(EVT_HANDLE handle);
29
33
 
34
+ #ifdef __cplusplus
35
+ }
36
+ #endif /* __cplusplus */
37
+
30
38
  VALUE rb_cQuery;
31
39
  VALUE rb_cChannel;
32
40
  VALUE rb_cBookmark;
@@ -203,7 +203,6 @@ rb_winevt_query_seek(VALUE self, VALUE bookmark_or_flag)
203
203
  {
204
204
  struct WinevtQuery *winevtQuery;
205
205
  struct WinevtBookmark *winevtBookmark = NULL;
206
- DWORD status;
207
206
  DWORD flag;
208
207
 
209
208
  switch (TYPE(bookmark_or_flag)) {
@@ -78,7 +78,6 @@ rb_winevt_subscribe_subscribe(int argc, VALUE *argv, VALUE self)
78
78
  VALUE wpathBuf, wqueryBuf;
79
79
  PWSTR path, query;
80
80
  DWORD status = ERROR_SUCCESS;
81
- struct WinevtBookmark *winevtBookmark;
82
81
  struct WinevtSubscribe *winevtSubscribe;
83
82
 
84
83
  hSignalEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
@@ -1,13 +1,14 @@
1
1
  #include <winevt_c.h>
2
2
  #include <sddl.h>
3
3
  #include <stdlib.h>
4
+ #include <string>
4
5
 
5
6
  char*
6
7
  wstr_to_mbstr(UINT cp, const WCHAR *wstr, int clen)
7
8
  {
8
9
  char *ptr;
9
10
  int len = WideCharToMultiByte(cp, 0, wstr, clen, NULL, 0, NULL, NULL);
10
- if (!(ptr = xmalloc(len))) return 0;
11
+ if (!(ptr = static_cast<char *>(xmalloc(len)))) return 0;
11
12
  WideCharToMultiByte(cp, 0, wstr, clen, ptr, len, NULL, NULL);
12
13
 
13
14
  return ptr;
@@ -25,14 +26,14 @@ WCHAR* render_event(EVT_HANDLE handle, DWORD flags)
25
26
  ULONG bufferSize = 0;
26
27
  ULONG bufferSizeNeeded = 0;
27
28
  ULONG status, count;
28
- static WCHAR* result = L"";
29
+ static WCHAR* result;
29
30
  LPTSTR msgBuf;
30
31
 
31
32
  do {
32
33
  if (bufferSizeNeeded > bufferSize) {
33
34
  free(buffer);
34
35
  bufferSize = bufferSizeNeeded;
35
- buffer = xmalloc(bufferSize);
36
+ buffer = static_cast<WCHAR *>(xmalloc(bufferSize));
36
37
  if (buffer == NULL) {
37
38
  status = ERROR_OUTOFMEMORY;
38
39
  bufferSize = 0;
@@ -77,13 +78,23 @@ WCHAR* render_event(EVT_HANDLE handle, DWORD flags)
77
78
  return result;
78
79
  }
79
80
 
81
+ static std::wstring guid_to_wstr(const GUID& guid) {
82
+ LPOLESTR p = NULL;
83
+ if (FAILED(StringFromCLSID(guid, &p))) {
84
+ return NULL;
85
+ }
86
+ std::wstring s(p);
87
+ CoTaskMemFree(p);
88
+ return s;
89
+ }
90
+
80
91
  VALUE get_values(EVT_HANDLE handle)
81
92
  {
82
- PWSTR buffer = NULL;
93
+ std::wstring buffer;
83
94
  ULONG bufferSize = 0;
84
95
  ULONG bufferSizeNeeded = 0;
85
96
  DWORD status, propCount = 0;
86
- char *result = "";
97
+ char *result;
87
98
  LPTSTR msgBuf;
88
99
  WCHAR* tmpWChar = NULL;
89
100
  VALUE userValues = rb_ary_new();
@@ -96,10 +107,9 @@ VALUE get_values(EVT_HANDLE handle)
96
107
 
97
108
  do {
98
109
  if (bufferSizeNeeded > bufferSize) {
99
- free(buffer);
100
110
  bufferSize = bufferSizeNeeded;
101
- buffer = xmalloc(bufferSize);
102
- if (buffer == NULL) {
111
+ buffer.resize(bufferSize);
112
+ if (buffer.c_str() == NULL) {
103
113
  status = ERROR_OUTOFMEMORY;
104
114
  bufferSize = 0;
105
115
  rb_raise(rb_eWinevtQueryError, "Out of memory");
@@ -110,8 +120,8 @@ VALUE get_values(EVT_HANDLE handle)
110
120
  if (EvtRender(renderContext,
111
121
  handle,
112
122
  EvtRenderEventValues,
113
- bufferSize,
114
- buffer,
123
+ buffer.size(),
124
+ &buffer[0],
115
125
  &bufferSizeNeeded,
116
126
  &propCount) != FALSE) {
117
127
  status = ERROR_SUCCESS;
@@ -135,7 +145,7 @@ VALUE get_values(EVT_HANDLE handle)
135
145
  rb_raise(rb_eWinevtQueryError, "ErrorCode: %d\nError: %s\n", status, RSTRING_PTR(errmsg));
136
146
  }
137
147
 
138
- PEVT_VARIANT pRenderedValues = (PEVT_VARIANT)buffer;
148
+ PEVT_VARIANT pRenderedValues = (PEVT_VARIANT)buffer.c_str();
139
149
  LARGE_INTEGER timestamp;
140
150
  SYSTEMTIME st;
141
151
  FILETIME ft;
@@ -205,16 +215,16 @@ VALUE get_values(EVT_HANDLE handle)
205
215
  rb_ary_push(userValues, rb_utf8_str_new_cstr(result));
206
216
  break;
207
217
  case EvtVarTypeBoolean:
208
- result = pRenderedValues[i].BooleanVal ? "true" : "false";
218
+ result = const_cast<char *>(pRenderedValues[i].BooleanVal ? "true" : "false");
209
219
  rb_ary_push(userValues, rb_utf8_str_new_cstr(result));
210
220
  break;
211
221
  case EvtVarTypeGuid:
212
222
  if (pRenderedValues[i].GuidVal != NULL) {
213
- StringFromCLSID(pRenderedValues[i].GuidVal, &tmpWChar);
214
- result = wstr_to_mbstr(CP_UTF8, tmpWChar, -1);
223
+ const GUID guid = *pRenderedValues[i].GuidVal;
224
+ std::wstring wstr = guid_to_wstr(guid);
225
+ result = wstr_to_mbstr(CP_UTF8, wstr.c_str(), -1);
215
226
  rb_ary_push(userValues, rb_utf8_str_new_cstr(result));
216
227
  free_allocated_mbstr(result);
217
- CoTaskMemFree(tmpWChar);
218
228
  } else {
219
229
  rb_ary_push(userValues, rb_utf8_str_new_cstr("?"));
220
230
  }
@@ -284,28 +294,22 @@ VALUE get_values(EVT_HANDLE handle)
284
294
  }
285
295
  }
286
296
 
287
- if (buffer)
288
- xfree(buffer);
289
-
290
297
  if (renderContext)
291
298
  EvtClose(renderContext);
292
299
 
293
300
  return userValues;
294
301
  }
295
302
 
296
- static WCHAR* get_message(EVT_HANDLE hMetadata, EVT_HANDLE handle)
303
+ static std::wstring get_message(EVT_HANDLE hMetadata, EVT_HANDLE handle)
297
304
  {
298
305
  #define BUFSIZE 4096
299
- static WCHAR* result = L"";
306
+ std::wstring result;
300
307
  ULONG status;
301
308
  ULONG bufferSizeNeeded = 0;
302
309
  LPVOID lpMsgBuf;
303
- WCHAR* prevBuffer;
304
- WCHAR *message;
305
- WCHAR *reallocatedMessage;
310
+ std::wstring message(BUFSIZE, '\0');
306
311
 
307
- message = (WCHAR *)xmalloc(sizeof(WCHAR) * BUFSIZE);
308
- if (!EvtFormatMessage(hMetadata, handle, 0xffffffff, 0, NULL, EvtFormatMessageEvent, BUFSIZE, message, &bufferSizeNeeded)) {
312
+ if (!EvtFormatMessage(hMetadata, handle, 0xffffffff, 0, NULL, EvtFormatMessageEvent, message.size(), &message[0], &bufferSizeNeeded)) {
309
313
  status = GetLastError();
310
314
 
311
315
  if (status != ERROR_EVT_UNRESOLVED_VALUE_INSERT) {
@@ -331,7 +335,7 @@ static WCHAR* get_message(EVT_HANDLE hMetadata, EVT_HANDLE handle)
331
335
  MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
332
336
  (WCHAR *) &lpMsgBuf, 0, NULL);
333
337
 
334
- result = _wcsdup((WCHAR *)lpMsgBuf);
338
+ result = (WCHAR *)lpMsgBuf;
335
339
  LocalFree(lpMsgBuf);
336
340
 
337
341
  goto cleanup;
@@ -344,14 +348,9 @@ static WCHAR* get_message(EVT_HANDLE hMetadata, EVT_HANDLE handle)
344
348
  }
345
349
 
346
350
  if (status == ERROR_INSUFFICIENT_BUFFER) {
347
- prevBuffer = message;
348
- reallocatedMessage = (WCHAR *)realloc(prevBuffer, sizeof(WCHAR) * bufferSizeNeeded);
349
- if (reallocatedMessage == NULL) {
350
- rb_raise(rb_eWinevtQueryError, "Reallocation failed.");
351
- }
352
- message = reallocatedMessage;
351
+ message.resize(bufferSizeNeeded);
353
352
 
354
- if(!EvtFormatMessage(hMetadata, handle, 0xffffffff, 0, NULL, EvtFormatMessageEvent, bufferSizeNeeded, message, &bufferSizeNeeded)) {
353
+ if(!EvtFormatMessage(hMetadata, handle, 0xffffffff, 0, NULL, EvtFormatMessageEvent, message.size(), &message[0], &bufferSizeNeeded)) {
355
354
  status = GetLastError();
356
355
 
357
356
  if (status != ERROR_EVT_UNRESOLVED_VALUE_INSERT) {
@@ -377,7 +376,7 @@ static WCHAR* get_message(EVT_HANDLE hMetadata, EVT_HANDLE handle)
377
376
  MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
378
377
  (WCHAR *) &lpMsgBuf, 0, NULL);
379
378
 
380
- result = _wcsdup((WCHAR *)lpMsgBuf);
379
+ result = (WCHAR *)lpMsgBuf;
381
380
  LocalFree(lpMsgBuf);
382
381
 
383
382
  goto cleanup;
@@ -389,14 +388,11 @@ static WCHAR* get_message(EVT_HANDLE hMetadata, EVT_HANDLE handle)
389
388
  }
390
389
  }
391
390
 
392
- result = _wcsdup(message);
391
+ result = message;
393
392
 
394
393
  cleanup:
395
394
 
396
- if (message)
397
- xfree(message);
398
-
399
- return result;
395
+ return std::wstring(result);
400
396
 
401
397
  #undef BUFSIZE
402
398
  }
@@ -404,14 +400,13 @@ cleanup:
404
400
  WCHAR* get_description(EVT_HANDLE handle)
405
401
  {
406
402
  #define BUFSIZE 4096
407
- WCHAR buffer[BUFSIZE];
403
+ std::wstring buffer(BUFSIZE, '\0');
408
404
  ULONG bufferSize = 0;
409
405
  ULONG bufferSizeNeeded = 0;
410
406
  ULONG status, count;
411
- static WCHAR *result = L"";
412
- LPTSTR msgBuf = "";
407
+ std::wstring result;
408
+ LPTSTR msgBuf;
413
409
  EVT_HANDLE hMetadata = NULL;
414
- PEVT_VARIANT values = NULL;
415
410
 
416
411
  static PCWSTR eventProperties[] = {L"Event/System/Provider/@Name"};
417
412
  EVT_HANDLE renderContext = EvtCreateRenderContext(1, eventProperties, EvtRenderContextValues);
@@ -422,8 +417,8 @@ WCHAR* get_description(EVT_HANDLE handle)
422
417
  if (EvtRender(renderContext,
423
418
  handle,
424
419
  EvtRenderEventValues,
425
- _countof(buffer),
426
- buffer,
420
+ buffer.size(),
421
+ &buffer[0],
427
422
  &bufferSizeNeeded,
428
423
  &count) != FALSE) {
429
424
  status = ERROR_SUCCESS;
@@ -447,7 +442,7 @@ WCHAR* get_description(EVT_HANDLE handle)
447
442
  }
448
443
 
449
444
  // Obtain buffer as EVT_VARIANT pointer. To avoid ErrorCide 87 in EvtRender.
450
- values = (PEVT_VARIANT)buffer;
445
+ const PEVT_VARIANT values = reinterpret_cast<PEVT_VARIANT>(const_cast<WCHAR *>(buffer.c_str()));
451
446
 
452
447
  // Open publisher metadata
453
448
  hMetadata = EvtOpenPublisherMetadata(NULL, values[0].StringVal, NULL, MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SORT_DEFAULT), 0);
@@ -457,7 +452,7 @@ WCHAR* get_description(EVT_HANDLE handle)
457
452
  goto cleanup;
458
453
  }
459
454
 
460
- result = _wcsdup(get_message(hMetadata, handle));
455
+ result = get_message(hMetadata, handle);
461
456
 
462
457
  #undef BUFSIZE
463
458
 
@@ -469,5 +464,5 @@ cleanup:
469
464
  if (hMetadata)
470
465
  EvtClose(hMetadata);
471
466
 
472
- return result;
467
+ return const_cast<WCHAR *>(result.c_str());
473
468
  }
Binary file
Binary file
Binary file
@@ -1,3 +1,3 @@
1
1
  module Winevt
2
- VERSION = "0.4.1"
2
+ VERSION = "0.4.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: winevt_c
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: x86-mingw32
6
6
  authors:
7
7
  - Hiroshi Hatake
@@ -111,7 +111,7 @@ files:
111
111
  - ext/winevt/winevt_channel.c
112
112
  - ext/winevt/winevt_query.c
113
113
  - ext/winevt/winevt_subscribe.c
114
- - ext/winevt/winevt_utils.c
114
+ - ext/winevt/winevt_utils.cpp
115
115
  - lib/winevt.rb
116
116
  - lib/winevt/2.4/winevt.so
117
117
  - lib/winevt/2.5/winevt.so