winevt_c 0.4.4 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -2
- data/ext/winevt/winevt_bookmark.c +1 -4
- data/ext/winevt/winevt_c.h +1 -0
- data/ext/winevt/winevt_channel.c +1 -5
- data/ext/winevt/winevt_query.c +2 -9
- data/ext/winevt/winevt_subscribe.c +3 -14
- data/ext/winevt/winevt_utils.cpp +72 -66
- data/lib/winevt/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 643bcdf4d5b8c420f73bbb333ff5f43d3aaa49fa5e5c5387f9b56b226a17a95b
|
4
|
+
data.tar.gz: 3e1ac4f307bc238cc6fd3b6a1899d40d5906f73760fdab659a2b13155d4aeab0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14c3237a1fd9e278a1413a75736b75c4715daf9c4f58799bf1136784d3e9139a61a0eca41ba124ce5e740507cfc7a6bcb3c991cd31fd0b453ddcd263486aedf0
|
7
|
+
data.tar.gz: 45562eefcdac2d2214233ee8633b01f0f2eedd258690fc37dbdfef0aaec7b6ca863f66665f499f1039bff25c8b07d327eaf2d444baad09cb85c8ccea5be9246d
|
data/README.md
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
[![Build status](https://ci.appveyor.com/api/projects/status/hr3phv8ihvgc68oj/branch/master?svg=true)](https://ci.appveyor.com/project/cosmo0920/winevt-c/branch/master)
|
4
4
|
|
5
|
+
## Prerequisites
|
6
|
+
|
7
|
+
* Windows Vista/Windows Server 2008 or later.
|
8
|
+
* gcc and g++ from MSYS2 for building C/C++ extension.
|
9
|
+
* Ruby 2.4 or later with MSYS2.
|
10
|
+
|
5
11
|
## Installation
|
6
12
|
|
7
13
|
Add this line to your application's Gemfile:
|
@@ -12,11 +18,11 @@ gem 'winevt_c'
|
|
12
18
|
|
13
19
|
And then execute:
|
14
20
|
|
15
|
-
$ bundle
|
21
|
+
$ ridk exec bundle
|
16
22
|
|
17
23
|
Or install it yourself as:
|
18
24
|
|
19
|
-
$ gem install winevt_c
|
25
|
+
$ ridk exec gem install winevt_c
|
20
26
|
|
21
27
|
## Usage
|
22
28
|
|
@@ -80,16 +80,13 @@ static VALUE
|
|
80
80
|
rb_winevt_bookmark_render(VALUE self)
|
81
81
|
{
|
82
82
|
WCHAR* wResult;
|
83
|
-
char* result;
|
84
83
|
struct WinevtBookmark *winevtBookmark;
|
85
84
|
VALUE utf8str;
|
86
85
|
|
87
86
|
TypedData_Get_Struct(self, struct WinevtBookmark, &rb_winevt_bookmark_type, winevtBookmark);
|
88
87
|
wResult = render_event(winevtBookmark->bookmark, EvtRenderBookmark);
|
89
|
-
|
88
|
+
utf8str = wstr_to_rb_str(CP_UTF8, wResult, -1);
|
90
89
|
|
91
|
-
utf8str = rb_utf8_str_new_cstr(result);
|
92
|
-
free_allocated_mbstr(result);
|
93
90
|
if (wResult != NULL)
|
94
91
|
free(wResult);
|
95
92
|
|
data/ext/winevt/winevt_c.h
CHANGED
@@ -27,6 +27,7 @@ extern "C" {
|
|
27
27
|
|
28
28
|
char* wstr_to_mbstr(UINT cp, const WCHAR *wstr, int clen);
|
29
29
|
void free_allocated_mbstr(const char* str);
|
30
|
+
VALUE wstr_to_rb_str(UINT cp, const WCHAR *wstr, int clen);
|
30
31
|
WCHAR* render_event(EVT_HANDLE handle, DWORD flags);
|
31
32
|
WCHAR* get_description(EVT_HANDLE handle);
|
32
33
|
VALUE get_values(EVT_HANDLE handle);
|
data/ext/winevt/winevt_channel.c
CHANGED
@@ -43,7 +43,6 @@ rb_winevt_channel_each(VALUE self)
|
|
43
43
|
EVT_HANDLE hChannels;
|
44
44
|
struct WinevtChannel *winevtChannel;
|
45
45
|
char *errBuf = NULL;
|
46
|
-
char * result;
|
47
46
|
LPWSTR buffer = NULL;
|
48
47
|
LPWSTR temp = NULL;
|
49
48
|
DWORD bufferSize = 0;
|
@@ -87,10 +86,7 @@ rb_winevt_channel_each(VALUE self)
|
|
87
86
|
}
|
88
87
|
}
|
89
88
|
|
90
|
-
|
91
|
-
|
92
|
-
utf8str = rb_utf8_str_new_cstr(result);
|
93
|
-
free_allocated_mbstr(result);
|
89
|
+
utf8str = wstr_to_rb_str(CP_UTF8, buffer, -1);
|
94
90
|
|
95
91
|
rb_yield(utf8str);
|
96
92
|
}
|
data/ext/winevt/winevt_query.c
CHANGED
@@ -138,16 +138,13 @@ static VALUE
|
|
138
138
|
rb_winevt_query_render(VALUE self)
|
139
139
|
{
|
140
140
|
WCHAR* wResult;
|
141
|
-
char* result;
|
142
141
|
struct WinevtQuery *winevtQuery;
|
143
142
|
VALUE utf8str;
|
144
143
|
|
145
144
|
TypedData_Get_Struct(self, struct WinevtQuery, &rb_winevt_query_type, winevtQuery);
|
146
145
|
wResult = render_event(winevtQuery->event, EvtRenderEventXml);
|
147
|
-
|
146
|
+
utf8str = wstr_to_rb_str(CP_UTF8, wResult, -1);
|
148
147
|
|
149
|
-
utf8str = rb_utf8_str_new_cstr(result);
|
150
|
-
free_allocated_mbstr(result);
|
151
148
|
if (wResult != NULL)
|
152
149
|
free(wResult);
|
153
150
|
|
@@ -158,16 +155,12 @@ static VALUE
|
|
158
155
|
rb_winevt_query_message(VALUE self)
|
159
156
|
{
|
160
157
|
WCHAR* wResult;
|
161
|
-
char* result;
|
162
158
|
struct WinevtQuery *winevtQuery;
|
163
159
|
VALUE utf8str;
|
164
160
|
|
165
161
|
TypedData_Get_Struct(self, struct WinevtQuery, &rb_winevt_query_type, winevtQuery);
|
166
162
|
wResult = get_description(winevtQuery->event);
|
167
|
-
|
168
|
-
|
169
|
-
utf8str = rb_utf8_str_new_cstr(result);
|
170
|
-
free_allocated_mbstr(result);
|
163
|
+
utf8str = wstr_to_rb_str(CP_UTF8, wResult, -1);
|
171
164
|
|
172
165
|
return utf8str;
|
173
166
|
}
|
@@ -153,16 +153,13 @@ static VALUE
|
|
153
153
|
rb_winevt_subscribe_render(VALUE self)
|
154
154
|
{
|
155
155
|
WCHAR* wResult;
|
156
|
-
char* result;
|
157
156
|
struct WinevtSubscribe *winevtSubscribe;
|
158
157
|
VALUE utf8str;
|
159
158
|
|
160
159
|
TypedData_Get_Struct(self, struct WinevtSubscribe, &rb_winevt_subscribe_type, winevtSubscribe);
|
161
160
|
wResult = render_event(winevtSubscribe->event, EvtRenderEventXml);
|
162
|
-
|
161
|
+
utf8str = wstr_to_rb_str(CP_UTF8, wResult, -1);
|
163
162
|
|
164
|
-
utf8str = rb_utf8_str_new_cstr(result);
|
165
|
-
free_allocated_mbstr(result);
|
166
163
|
if (wResult != NULL)
|
167
164
|
free(wResult);
|
168
165
|
|
@@ -173,16 +170,12 @@ static VALUE
|
|
173
170
|
rb_winevt_subscribe_message(VALUE self)
|
174
171
|
{
|
175
172
|
WCHAR* wResult;
|
176
|
-
char* result;
|
177
173
|
struct WinevtSubscribe *winevtSubscribe;
|
178
174
|
VALUE utf8str;
|
179
175
|
|
180
176
|
TypedData_Get_Struct(self, struct WinevtSubscribe, &rb_winevt_subscribe_type, winevtSubscribe);
|
181
177
|
wResult = get_description(winevtSubscribe->event);
|
182
|
-
|
183
|
-
|
184
|
-
utf8str = rb_utf8_str_new_cstr(result);
|
185
|
-
free_allocated_mbstr(result);
|
178
|
+
utf8str = wstr_to_rb_str(CP_UTF8, wResult, -1);
|
186
179
|
|
187
180
|
return utf8str;
|
188
181
|
}
|
@@ -219,17 +212,13 @@ static VALUE
|
|
219
212
|
rb_winevt_subscribe_get_bookmark(VALUE self)
|
220
213
|
{
|
221
214
|
WCHAR* wResult;
|
222
|
-
char* result;
|
223
215
|
struct WinevtSubscribe *winevtSubscribe;
|
224
216
|
VALUE utf8str;
|
225
217
|
|
226
218
|
TypedData_Get_Struct(self, struct WinevtSubscribe, &rb_winevt_subscribe_type, winevtSubscribe);
|
227
219
|
|
228
220
|
wResult = render_event(winevtSubscribe->bookmark, EvtRenderBookmark);
|
229
|
-
|
230
|
-
|
231
|
-
utf8str = rb_utf8_str_new_cstr(result);
|
232
|
-
free_allocated_mbstr(result);
|
221
|
+
utf8str = wstr_to_rb_str(CP_UTF8, wResult, -1);
|
233
222
|
|
234
223
|
return utf8str;
|
235
224
|
}
|
data/ext/winevt/winevt_utils.cpp
CHANGED
@@ -7,9 +7,9 @@ char*
|
|
7
7
|
wstr_to_mbstr(UINT cp, const WCHAR *wstr, int clen)
|
8
8
|
{
|
9
9
|
char *ptr;
|
10
|
-
int len = WideCharToMultiByte(cp, 0, wstr, clen,
|
11
|
-
if (!(ptr = static_cast<char *>(xmalloc(len)))) return
|
12
|
-
WideCharToMultiByte(cp, 0, wstr, clen, ptr, len,
|
10
|
+
int len = WideCharToMultiByte(cp, 0, wstr, clen, nullptr, 0, nullptr, nullptr);
|
11
|
+
if (!(ptr = static_cast<char *>(xmalloc(len)))) return nullptr;
|
12
|
+
WideCharToMultiByte(cp, 0, wstr, clen, ptr, len, nullptr, nullptr);
|
13
13
|
|
14
14
|
return ptr;
|
15
15
|
}
|
@@ -20,9 +20,19 @@ void free_allocated_mbstr(const char* str)
|
|
20
20
|
xfree((char *)str);
|
21
21
|
}
|
22
22
|
|
23
|
+
VALUE
|
24
|
+
wstr_to_rb_str(UINT cp, const WCHAR *wstr, int clen)
|
25
|
+
{
|
26
|
+
int len = WideCharToMultiByte(cp, 0, wstr, clen, nullptr, 0, nullptr, nullptr);
|
27
|
+
VALUE str = rb_utf8_str_new(0, len);
|
28
|
+
WideCharToMultiByte(cp, 0, wstr, clen, RSTRING_PTR(str), len, nullptr, nullptr);
|
29
|
+
|
30
|
+
return str;
|
31
|
+
}
|
32
|
+
|
23
33
|
WCHAR* render_event(EVT_HANDLE handle, DWORD flags)
|
24
34
|
{
|
25
|
-
PWSTR buffer =
|
35
|
+
PWSTR buffer = nullptr;
|
26
36
|
ULONG bufferSize = 0;
|
27
37
|
ULONG bufferSizeNeeded = 0;
|
28
38
|
ULONG status, count;
|
@@ -34,7 +44,7 @@ WCHAR* render_event(EVT_HANDLE handle, DWORD flags)
|
|
34
44
|
free(buffer);
|
35
45
|
bufferSize = bufferSizeNeeded;
|
36
46
|
buffer = static_cast<WCHAR *>(xmalloc(bufferSize));
|
37
|
-
if (buffer ==
|
47
|
+
if (buffer == nullptr) {
|
38
48
|
status = ERROR_OUTOFMEMORY;
|
39
49
|
bufferSize = 0;
|
40
50
|
rb_raise(rb_eWinevtQueryError, "Out of memory");
|
@@ -42,7 +52,7 @@ WCHAR* render_event(EVT_HANDLE handle, DWORD flags)
|
|
42
52
|
}
|
43
53
|
}
|
44
54
|
|
45
|
-
if (EvtRender(
|
55
|
+
if (EvtRender(nullptr,
|
46
56
|
handle,
|
47
57
|
flags,
|
48
58
|
bufferSize,
|
@@ -60,9 +70,9 @@ WCHAR* render_event(EVT_HANDLE handle, DWORD flags)
|
|
60
70
|
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
61
71
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
62
72
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
63
|
-
|
73
|
+
nullptr, status,
|
64
74
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
65
|
-
msgBuf, 0,
|
75
|
+
msgBuf, 0, nullptr);
|
66
76
|
|
67
77
|
VALUE errmsg = rb_str_new2(msgBuf);
|
68
78
|
LocalFree(msgBuf);
|
@@ -79,9 +89,9 @@ WCHAR* render_event(EVT_HANDLE handle, DWORD flags)
|
|
79
89
|
}
|
80
90
|
|
81
91
|
static std::wstring guid_to_wstr(const GUID& guid) {
|
82
|
-
LPOLESTR p =
|
92
|
+
LPOLESTR p = nullptr;
|
83
93
|
if (FAILED(StringFromCLSID(guid, &p))) {
|
84
|
-
return
|
94
|
+
return nullptr;
|
85
95
|
}
|
86
96
|
std::wstring s(p);
|
87
97
|
CoTaskMemFree(p);
|
@@ -96,12 +106,12 @@ VALUE get_values(EVT_HANDLE handle)
|
|
96
106
|
DWORD status, propCount = 0;
|
97
107
|
char *result;
|
98
108
|
LPTSTR msgBuf;
|
99
|
-
WCHAR* tmpWChar =
|
109
|
+
WCHAR* tmpWChar = nullptr;
|
100
110
|
VALUE userValues = rb_ary_new();
|
101
111
|
|
102
112
|
static PCWSTR eventProperties[] = { L"Event/EventData/Data[1]" };
|
103
|
-
EVT_HANDLE renderContext = EvtCreateRenderContext(0,
|
104
|
-
if (renderContext ==
|
113
|
+
EVT_HANDLE renderContext = EvtCreateRenderContext(0, nullptr, EvtRenderContextUser);
|
114
|
+
if (renderContext == nullptr) {
|
105
115
|
rb_raise(rb_eWinevtQueryError, "Failed to create renderContext");
|
106
116
|
}
|
107
117
|
|
@@ -136,9 +146,9 @@ VALUE get_values(EVT_HANDLE handle)
|
|
136
146
|
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
137
147
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
138
148
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
139
|
-
|
149
|
+
nullptr, status,
|
140
150
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
141
|
-
msgBuf, 0,
|
151
|
+
msgBuf, 0, nullptr);
|
142
152
|
|
143
153
|
VALUE errmsg = rb_str_new2(msgBuf);
|
144
154
|
LocalFree(msgBuf);
|
@@ -146,11 +156,12 @@ VALUE get_values(EVT_HANDLE handle)
|
|
146
156
|
rb_raise(rb_eWinevtQueryError, "ErrorCode: %lu\nError: %s\n", status, RSTRING_PTR(errmsg));
|
147
157
|
}
|
148
158
|
|
149
|
-
PEVT_VARIANT pRenderedValues = (
|
159
|
+
PEVT_VARIANT pRenderedValues = reinterpret_cast<PEVT_VARIANT>(const_cast<WCHAR *>(buffer.c_str()));
|
150
160
|
LARGE_INTEGER timestamp;
|
151
161
|
SYSTEMTIME st;
|
152
162
|
FILETIME ft;
|
153
|
-
|
163
|
+
std::string strTime;
|
164
|
+
std::string sResult;
|
154
165
|
VALUE rbObj;
|
155
166
|
|
156
167
|
for (int i = 0; i < propCount; i++) {
|
@@ -159,35 +170,34 @@ VALUE get_values(EVT_HANDLE handle)
|
|
159
170
|
rb_ary_push(userValues, Qnil);
|
160
171
|
break;
|
161
172
|
case EvtVarTypeString:
|
162
|
-
if (pRenderedValues[i].StringVal ==
|
173
|
+
if (pRenderedValues[i].StringVal == nullptr) {
|
163
174
|
rb_ary_push(userValues, rb_utf8_str_new_cstr("(NULL)"));
|
164
175
|
} else {
|
165
|
-
|
166
|
-
rb_ary_push(userValues,
|
167
|
-
free_allocated_mbstr(result);
|
176
|
+
rbObj = wstr_to_rb_str(CP_UTF8, pRenderedValues[i].StringVal, -1);
|
177
|
+
rb_ary_push(userValues, rbObj);
|
168
178
|
}
|
169
179
|
break;
|
170
180
|
case EvtVarTypeAnsiString:
|
171
|
-
if (pRenderedValues[i].AnsiStringVal ==
|
181
|
+
if (pRenderedValues[i].AnsiStringVal == nullptr) {
|
172
182
|
rb_ary_push(userValues, rb_utf8_str_new_cstr("(NULL)"));
|
173
183
|
} else {
|
174
|
-
rb_ary_push(userValues, rb_utf8_str_new_cstr(
|
184
|
+
rb_ary_push(userValues, rb_utf8_str_new_cstr(const_cast<char *>(pRenderedValues[i].AnsiStringVal)));
|
175
185
|
}
|
176
186
|
break;
|
177
187
|
case EvtVarTypeSByte:
|
178
|
-
rbObj = INT2NUM((
|
188
|
+
rbObj = INT2NUM(static_cast<UINT32>(pRenderedValues[i].SByteVal));
|
179
189
|
rb_ary_push(userValues, rbObj);
|
180
190
|
break;
|
181
191
|
case EvtVarTypeByte:
|
182
|
-
rbObj = INT2NUM((
|
192
|
+
rbObj = INT2NUM(static_cast<UINT32>(pRenderedValues[i].ByteVal));
|
183
193
|
rb_ary_push(userValues, rbObj);
|
184
194
|
break;
|
185
195
|
case EvtVarTypeInt16:
|
186
|
-
rbObj = INT2NUM((
|
196
|
+
rbObj = INT2NUM(static_cast<INT32>(pRenderedValues[i].Int16Val));
|
187
197
|
rb_ary_push(userValues, rbObj);
|
188
198
|
break;
|
189
199
|
case EvtVarTypeUInt16:
|
190
|
-
rbObj = UINT2NUM((
|
200
|
+
rbObj = UINT2NUM(static_cast<UINT32>(pRenderedValues[i].UInt16Val));
|
191
201
|
rb_ary_push(userValues, rbObj);
|
192
202
|
break;
|
193
203
|
case EvtVarTypeInt32:
|
@@ -207,25 +217,23 @@ VALUE get_values(EVT_HANDLE handle)
|
|
207
217
|
rb_ary_push(userValues, rbObj);
|
208
218
|
break;
|
209
219
|
case EvtVarTypeSingle:
|
210
|
-
sprintf(
|
211
|
-
rb_ary_push(userValues, rb_utf8_str_new_cstr(
|
212
|
-
free_allocated_mbstr(result);
|
220
|
+
sprintf(&sResult[0], "%f", pRenderedValues[i].SingleVal);
|
221
|
+
rb_ary_push(userValues, rb_utf8_str_new_cstr(sResult.c_str()));
|
213
222
|
break;
|
214
223
|
case EvtVarTypeDouble:
|
215
|
-
sprintf(
|
216
|
-
rb_ary_push(userValues, rb_utf8_str_new_cstr(
|
224
|
+
sprintf(&sResult[0], "%lf", pRenderedValues[i].DoubleVal);
|
225
|
+
rb_ary_push(userValues, rb_utf8_str_new_cstr(sResult.c_str()));
|
217
226
|
break;
|
218
227
|
case EvtVarTypeBoolean:
|
219
228
|
result = const_cast<char *>(pRenderedValues[i].BooleanVal ? "true" : "false");
|
220
229
|
rb_ary_push(userValues, rb_utf8_str_new_cstr(result));
|
221
230
|
break;
|
222
231
|
case EvtVarTypeGuid:
|
223
|
-
if (pRenderedValues[i].GuidVal !=
|
232
|
+
if (pRenderedValues[i].GuidVal != nullptr) {
|
224
233
|
const GUID guid = *pRenderedValues[i].GuidVal;
|
225
234
|
std::wstring wstr = guid_to_wstr(guid);
|
226
|
-
|
227
|
-
rb_ary_push(userValues,
|
228
|
-
free_allocated_mbstr(result);
|
235
|
+
rbObj = wstr_to_rb_str(CP_UTF8, wstr.c_str(), -1);
|
236
|
+
rb_ary_push(userValues, rbObj);
|
229
237
|
} else {
|
230
238
|
rb_ary_push(userValues, rb_utf8_str_new_cstr("?"));
|
231
239
|
}
|
@@ -239,32 +247,31 @@ VALUE get_values(EVT_HANDLE handle)
|
|
239
247
|
ft.dwHighDateTime = timestamp.HighPart;
|
240
248
|
ft.dwLowDateTime = timestamp.LowPart;
|
241
249
|
if (FileTimeToSystemTime( &ft, &st )) {
|
242
|
-
sprintf(strTime, "%04d-%02d-%02d %02d:%02d:%02d.%dZ",
|
250
|
+
sprintf(&strTime[0], "%04d-%02d-%02d %02d:%02d:%02d.%dZ",
|
243
251
|
st.wYear , st.wMonth , st.wDay ,
|
244
252
|
st.wHour , st.wMinute , st.wSecond,
|
245
253
|
st.wMilliseconds);
|
246
|
-
rb_ary_push(userValues, rb_utf8_str_new_cstr(strTime));
|
254
|
+
rb_ary_push(userValues, rb_utf8_str_new_cstr(strTime.c_str()));
|
247
255
|
} else {
|
248
256
|
rb_ary_push(userValues, rb_utf8_str_new_cstr("?"));
|
249
257
|
}
|
250
258
|
break;
|
251
259
|
case EvtVarTypeSysTime:
|
252
|
-
if (pRenderedValues[i].SysTimeVal !=
|
260
|
+
if (pRenderedValues[i].SysTimeVal != nullptr) {
|
253
261
|
st = *pRenderedValues[i].SysTimeVal;
|
254
|
-
sprintf(strTime, "%04d-%02d-%02d %02d:%02d:%02d.%dZ",
|
262
|
+
sprintf(&strTime[0], "%04d-%02d-%02d %02d:%02d:%02d.%dZ",
|
255
263
|
st.wYear , st.wMonth , st.wDay ,
|
256
264
|
st.wHour , st.wMinute , st.wSecond,
|
257
265
|
st.wMilliseconds);
|
258
|
-
rb_ary_push(userValues, rb_utf8_str_new_cstr(strTime));
|
266
|
+
rb_ary_push(userValues, rb_utf8_str_new_cstr(strTime.c_str()));
|
259
267
|
} else {
|
260
268
|
rb_ary_push(userValues, rb_utf8_str_new_cstr("?"));
|
261
269
|
}
|
262
270
|
break;
|
263
271
|
case EvtVarTypeSid:
|
264
272
|
if (ConvertSidToStringSidW(pRenderedValues[i].SidVal, &tmpWChar)) {
|
265
|
-
|
266
|
-
rb_ary_push(userValues,
|
267
|
-
free_allocated_mbstr(result);
|
273
|
+
rbObj = wstr_to_rb_str(CP_UTF8, tmpWChar, -1);
|
274
|
+
rb_ary_push(userValues, rbObj);
|
268
275
|
LocalFree(tmpWChar);
|
269
276
|
} else {
|
270
277
|
rb_ary_push(userValues, rb_utf8_str_new_cstr("?"));
|
@@ -281,12 +288,11 @@ VALUE get_values(EVT_HANDLE handle)
|
|
281
288
|
rb_ary_push(userValues, rbObj);
|
282
289
|
break;
|
283
290
|
case EvtVarTypeEvtXml:
|
284
|
-
if (pRenderedValues[i].XmlVal ==
|
291
|
+
if (pRenderedValues[i].XmlVal == nullptr) {
|
285
292
|
rb_ary_push(userValues, rb_utf8_str_new_cstr("(NULL)"));
|
286
293
|
} else {
|
287
|
-
|
288
|
-
rb_ary_push(userValues,
|
289
|
-
free_allocated_mbstr(result);
|
294
|
+
rbObj = wstr_to_rb_str(CP_UTF8, pRenderedValues[i].XmlVal, -1);
|
295
|
+
rb_ary_push(userValues, rbObj);
|
290
296
|
}
|
291
297
|
break;
|
292
298
|
default:
|
@@ -310,7 +316,7 @@ static std::wstring get_message(EVT_HANDLE hMetadata, EVT_HANDLE handle)
|
|
310
316
|
LPVOID lpMsgBuf;
|
311
317
|
std::wstring message(BUFSIZE, '\0');
|
312
318
|
|
313
|
-
if (!EvtFormatMessage(hMetadata, handle, 0xffffffff, 0,
|
319
|
+
if (!EvtFormatMessage(hMetadata, handle, 0xffffffff, 0, nullptr, EvtFormatMessageEvent, message.size(), &message[0], &bufferSizeNeeded)) {
|
314
320
|
status = GetLastError();
|
315
321
|
|
316
322
|
if (status != ERROR_EVT_UNRESOLVED_VALUE_INSERT) {
|
@@ -324,19 +330,19 @@ static std::wstring get_message(EVT_HANDLE hMetadata, EVT_HANDLE handle)
|
|
324
330
|
if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
325
331
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
326
332
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
327
|
-
|
333
|
+
nullptr,
|
328
334
|
status,
|
329
335
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
330
|
-
|
336
|
+
reinterpret_cast<WCHAR *>(&lpMsgBuf), 0, nullptr) == 0)
|
331
337
|
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
332
338
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
333
339
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
334
|
-
|
340
|
+
nullptr,
|
335
341
|
status,
|
336
342
|
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
|
337
|
-
|
343
|
+
reinterpret_cast<WCHAR *>(&lpMsgBuf), 0, nullptr);
|
338
344
|
|
339
|
-
result =
|
345
|
+
result = reinterpret_cast<WCHAR *>(lpMsgBuf);
|
340
346
|
LocalFree(lpMsgBuf);
|
341
347
|
|
342
348
|
goto cleanup;
|
@@ -351,7 +357,7 @@ static std::wstring get_message(EVT_HANDLE hMetadata, EVT_HANDLE handle)
|
|
351
357
|
if (status == ERROR_INSUFFICIENT_BUFFER) {
|
352
358
|
message.resize(bufferSizeNeeded);
|
353
359
|
|
354
|
-
if(!EvtFormatMessage(hMetadata, handle, 0xffffffff, 0,
|
360
|
+
if(!EvtFormatMessage(hMetadata, handle, 0xffffffff, 0, nullptr, EvtFormatMessageEvent, message.size(), &message[0], &bufferSizeNeeded)) {
|
355
361
|
status = GetLastError();
|
356
362
|
|
357
363
|
if (status != ERROR_EVT_UNRESOLVED_VALUE_INSERT) {
|
@@ -365,19 +371,19 @@ static std::wstring get_message(EVT_HANDLE hMetadata, EVT_HANDLE handle)
|
|
365
371
|
if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
366
372
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
367
373
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
368
|
-
|
374
|
+
nullptr,
|
369
375
|
status,
|
370
376
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
371
|
-
|
377
|
+
reinterpret_cast<WCHAR *>(&lpMsgBuf), 0, nullptr) == 0)
|
372
378
|
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
373
379
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
374
380
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
375
|
-
|
381
|
+
nullptr,
|
376
382
|
status,
|
377
383
|
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
|
378
|
-
|
384
|
+
reinterpret_cast<WCHAR *>(&lpMsgBuf), 0, nullptr);
|
379
385
|
|
380
|
-
result =
|
386
|
+
result = reinterpret_cast<WCHAR *>(lpMsgBuf);
|
381
387
|
LocalFree(lpMsgBuf);
|
382
388
|
|
383
389
|
goto cleanup;
|
@@ -407,11 +413,11 @@ WCHAR* get_description(EVT_HANDLE handle)
|
|
407
413
|
ULONG status, count;
|
408
414
|
std::wstring result;
|
409
415
|
LPTSTR msgBuf;
|
410
|
-
EVT_HANDLE hMetadata =
|
416
|
+
EVT_HANDLE hMetadata = nullptr;
|
411
417
|
|
412
418
|
static PCWSTR eventProperties[] = {L"Event/System/Provider/@Name"};
|
413
419
|
EVT_HANDLE renderContext = EvtCreateRenderContext(1, eventProperties, EvtRenderContextValues);
|
414
|
-
if (renderContext ==
|
420
|
+
if (renderContext == nullptr) {
|
415
421
|
rb_raise(rb_eWinevtQueryError, "Failed to create renderContext");
|
416
422
|
}
|
417
423
|
|
@@ -432,9 +438,9 @@ WCHAR* get_description(EVT_HANDLE handle)
|
|
432
438
|
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
433
439
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
434
440
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
435
|
-
|
441
|
+
nullptr, status,
|
436
442
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
437
|
-
msgBuf, 0,
|
443
|
+
msgBuf, 0, nullptr);
|
438
444
|
|
439
445
|
VALUE errmsg = rb_str_new2(msgBuf);
|
440
446
|
LocalFree(msgBuf);
|
@@ -446,8 +452,8 @@ WCHAR* get_description(EVT_HANDLE handle)
|
|
446
452
|
const PEVT_VARIANT values = reinterpret_cast<PEVT_VARIANT>(const_cast<WCHAR *>(buffer.c_str()));
|
447
453
|
|
448
454
|
// Open publisher metadata
|
449
|
-
hMetadata = EvtOpenPublisherMetadata(
|
450
|
-
if (hMetadata ==
|
455
|
+
hMetadata = EvtOpenPublisherMetadata(nullptr, values[0].StringVal, nullptr, MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SORT_DEFAULT), 0);
|
456
|
+
if (hMetadata == nullptr) {
|
451
457
|
// When winevt_c cannot open metadata, then give up to obtain
|
452
458
|
// message file and clean up immediately.
|
453
459
|
goto cleanup;
|
data/lib/winevt/version.rb
CHANGED
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.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroshi Hatake
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-07-
|
11
|
+
date: 2019-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|