winevt_c 0.4.4 → 0.4.5
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.
- 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
|
[](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
|