summaryrefslogtreecommitdiffstats
path: root/src/collectors/windows-events.plugin/windows-events.h
blob: 34d600a984a683cfe4ea2d70d2d13276acb0df78 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
// SPDX-License-Identifier: GPL-3.0-or-later

#ifndef NETDATA_WINDOWS_EVENTS_H
#define NETDATA_WINDOWS_EVENTS_H

#include "libnetdata/libnetdata.h"
#include "collectors/all.h"

typedef enum {
    WEVT_NO_CHANNEL_MATCHED,
    WEVT_FAILED_TO_OPEN,
    WEVT_FAILED_TO_SEEK,
    WEVT_TIMED_OUT,
    WEVT_OK,
    WEVT_NOT_MODIFIED,
    WEVT_CANCELLED,
} WEVT_QUERY_STATUS;

#define WEVT_CHANNEL_CLASSIC_TRACE      0x0
#define WEVT_CHANNEL_GLOBAL_SYSTEM      0x8
#define WEVT_CHANNEL_GLOBAL_APPLICATION 0x9
#define WEVT_CHANNEL_GLOBAL_SECURITY    0xa

#define WEVT_LEVEL_NONE                 0x0
#define WEVT_LEVEL_CRITICAL             0x1
#define WEVT_LEVEL_ERROR                0x2
#define WEVT_LEVEL_WARNING              0x3
#define WEVT_LEVEL_INFORMATION          0x4
#define WEVT_LEVEL_VERBOSE              0x5
#define WEVT_LEVEL_RESERVED_6           0x6
#define WEVT_LEVEL_RESERVED_7           0x7
#define WEVT_LEVEL_RESERVED_8           0x8
#define WEVT_LEVEL_RESERVED_9           0x9
#define WEVT_LEVEL_RESERVED_10          0xa
#define WEVT_LEVEL_RESERVED_11          0xb
#define WEVT_LEVEL_RESERVED_12          0xc
#define WEVT_LEVEL_RESERVED_13          0xd
#define WEVT_LEVEL_RESERVED_14          0xe
#define WEVT_LEVEL_RESERVED_15          0xf

#define WEVT_OPCODE_INFO                0x0
#define WEVT_OPCODE_START               0x1
#define WEVT_OPCODE_STOP                0x2
#define WEVT_OPCODE_DC_START            0x3
#define WEVT_OPCODE_DC_STOP             0x4
#define WEVT_OPCODE_EXTENSION           0x5
#define WEVT_OPCODE_REPLY               0x6
#define WEVT_OPCODE_RESUME              0x7
#define WEVT_OPCODE_SUSPEND             0x8
#define WEVT_OPCODE_SEND                0x9
#define WEVT_OPCODE_RECEIVE             0xf0
#define WEVT_OPCODE_RESERVED_241        0xf1
#define WEVT_OPCODE_RESERVED_242        0xf2
#define WEVT_OPCODE_RESERVED_243        0xf3
#define WEVT_OPCODE_RESERVED_244        0xf4
#define WEVT_OPCODE_RESERVED_245        0xf5
#define WEVT_OPCODE_RESERVED_246        0xf6
#define WEVT_OPCODE_RESERVED_247        0xf7
#define WEVT_OPCODE_RESERVED_248        0xf8
#define WEVT_OPCODE_RESERVED_249        0xf9
#define WEVT_OPCODE_RESERVED_250        0xfa
#define WEVT_OPCODE_RESERVED_251        0xfb
#define WEVT_OPCODE_RESERVED_252        0xfc
#define WEVT_OPCODE_RESERVED_253        0xfd
#define WEVT_OPCODE_RESERVED_254        0xfe
#define WEVT_OPCODE_RESERVED_255        0xff

#define WEVT_TASK_NONE                  0x0

#define WEVT_KEYWORD_NONE               0x0
#define WEVT_KEYWORD_RESPONSE_TIME      0x0001000000000000
#define WEVT_KEYWORD_WDI_CONTEXT        0x0002000000000000
#define WEVT_KEYWORD_WDI_DIAG           0x0004000000000000
#define WEVT_KEYWORD_SQM                0x0008000000000000
#define WEVT_KEYWORD_AUDIT_FAILURE      0x0010000000000000
#define WEVT_KEYWORD_AUDIT_SUCCESS      0x0020000000000000
#define WEVT_KEYWORD_CORRELATION_HINT   0x0040000000000000
#define WEVT_KEYWORD_EVENTLOG_CLASSIC   0x0080000000000000
#define WEVT_KEYWORD_RESERVED_56        0x0100000000000000
#define WEVT_KEYWORD_RESERVED_57        0x0200000000000000
#define WEVT_KEYWORD_RESERVED_58        0x0400000000000000
#define WEVT_KEYWORD_RESERVED_59        0x0800000000000000
#define WEVT_KEYWORDE_RESERVED_60       0x1000000000000000
#define WEVT_KEYWORD_RESERVED_61        0x2000000000000000
#define WEVT_KEYWORD_RESERVED_62        0x4000000000000000
#define WEVT_KEYWORD_RESERVED_63        0x8000000000000000

#define WEVT_LEVEL_NAME_NONE                "None"
#define WEVT_LEVEL_NAME_CRITICAL            "Critical"
#define WEVT_LEVEL_NAME_ERROR               "Error"
#define WEVT_LEVEL_NAME_WARNING             "Warning"
#define WEVT_LEVEL_NAME_INFORMATION         "Information"
#define WEVT_LEVEL_NAME_VERBOSE             "Verbose"

#define WEVT_OPCODE_NAME_INFO               "Info"
#define WEVT_OPCODE_NAME_START              "Start"
#define WEVT_OPCODE_NAME_STOP               "Stop"
#define WEVT_OPCODE_NAME_DC_START           "DC Start"
#define WEVT_OPCODE_NAME_DC_STOP            "DC Stop"
#define WEVT_OPCODE_NAME_EXTENSION          "Extension"
#define WEVT_OPCODE_NAME_REPLY              "Reply"
#define WEVT_OPCODE_NAME_RESUME             "Resume"
#define WEVT_OPCODE_NAME_SUSPEND            "Suspend"
#define WEVT_OPCODE_NAME_SEND               "Send"
#define WEVT_OPCODE_NAME_RECEIVE            "Receive"

#define WEVT_TASK_NAME_NONE                 "None"

#define WEVT_KEYWORD_NAME_NONE              "None"
#define WEVT_KEYWORD_NAME_RESPONSE_TIME     "Response Time"
#define WEVT_KEYWORD_NAME_WDI_CONTEXT       "WDI Context"
#define WEVT_KEYWORD_NAME_WDI_DIAG          "WDI Diagnostics"
#define WEVT_KEYWORD_NAME_SQM               "SQM (Software Quality Metrics)"
#define WEVT_KEYWORD_NAME_AUDIT_FAILURE     "Audit Failure"
#define WEVT_KEYWORD_NAME_AUDIT_SUCCESS     "Audit Success"
#define WEVT_KEYWORD_NAME_CORRELATION_HINT  "Correlation Hint"
#define WEVT_KEYWORD_NAME_EVENTLOG_CLASSIC  "Event Log Classic"

#define WEVT_PREFIX_LEVEL                   "Level "        // the space at the end is needed
#define WEVT_PREFIX_KEYWORDS                "Keywords "     // the space at the end is needed
#define WEVT_PREFIX_OPCODE                  "Opcode "       // the space at the end is needed
#define WEVT_PREFIX_TASK                    "Task "         // the space at the end is needed

#include "windows-events-sources.h"
#include "windows-events-unicode.h"
#include "windows-events-xml.h"
#include "windows-events-providers.h"
#include "windows-events-fields-cache.h"
#include "windows-events-query.h"

// enable or disable preloading on full-text-search
#define ON_FTS_PRELOAD_MESSAGE      1
#define ON_FTS_PRELOAD_XML          0
#define ON_FTS_PRELOAD_EVENT_DATA   1

#define WEVT_FUNCTION_DESCRIPTION    "View, search and analyze the Microsoft Windows Events log."
#define WEVT_FUNCTION_NAME           "windows-events"

#define WINDOWS_EVENTS_WORKER_THREADS 5
#define WINDOWS_EVENTS_DEFAULT_TIMEOUT 600
#define WINDOWS_EVENTS_SCAN_EVERY_USEC (5 * 60 * USEC_PER_SEC)
#define WINDOWS_EVENTS_PROGRESS_EVERY_UT (250 * USEC_PER_MS)
#define FUNCTION_PROGRESS_EVERY_ROWS (2000)
#define FUNCTION_DATA_ONLY_CHECK_EVERY_ROWS (1000)
#define ANCHOR_DELTA_UT (10 * USEC_PER_SEC)

// run providers release every 5 mins
#define WINDOWS_EVENTS_RELEASE_PROVIDERS_HANDLES_EVERY_UT (5 * 60 * USEC_PER_SEC)
// release idle handles that are older than 5 mins
#define WINDOWS_EVENTS_RELEASE_IDLE_PROVIDER_HANDLES_TIME_UT (5 * 60 * USEC_PER_SEC)

#define WEVT_FIELD_COMPUTER             "Computer"
#define WEVT_FIELD_CHANNEL              "Channel"
#define WEVT_FIELD_PROVIDER             "Provider"
#define WEVT_FIELD_PROVIDER_GUID        "ProviderGUID"
#define WEVT_FIELD_EVENTRECORDID        "EventRecordID"
#define WEVT_FIELD_VERSION              "Version"
#define WEVT_FIELD_QUALIFIERS           "Qualifiers"
#define WEVT_FIELD_EVENTID              "EventID"
#define WEVT_FIELD_LEVEL                "Level"
#define WEVT_FIELD_KEYWORDS             "Keywords"
#define WEVT_FIELD_OPCODE               "Opcode"
#define WEVT_FIELD_ACCOUNT              "UserAccount"
#define WEVT_FIELD_DOMAIN               "UserDomain"
#define WEVT_FIELD_SID                  "UserSID"
#define WEVT_FIELD_TASK                 "Task"
#define WEVT_FIELD_PROCESSID            "ProcessID"
#define WEVT_FIELD_THREADID             "ThreadID"
#define WEVT_FIELD_ACTIVITY_ID          "ActivityID"
#define WEVT_FIELD_RELATED_ACTIVITY_ID  "RelatedActivityID"
#define WEVT_FIELD_XML                  "XML"
#define WEVT_FIELD_MESSAGE              "Message"
#define WEVT_FIELD_EVENTS_API           "EventsAPI"
#define WEVT_FIELD_EVENT_DATA_HIDDEN    "__HIDDEN__EVENT__DATA__"
#define WEVT_FIELD_EVENT_MESSAGE_HIDDEN "__HIDDEN__MESSAGE__DATA__"
#define WEVT_FIELD_EVENT_XML_HIDDEN     "__HIDDEN__XML__DATA__"

// functions needed by LQS

// structures needed by LQS
struct lqs_extension {
    wchar_t *query;

    struct {
        struct {
            size_t completed;
            size_t total;
        } queries;

        struct {
            size_t current_query_total;
            size_t completed;
            size_t total;
        } entries;

        usec_t last_ut;
    } progress;

    // struct {
    //     usec_t start_ut;
    //     usec_t stop_ut;
    //     usec_t first_msg_ut;
    //
    //     uint64_t first_msg_seqnum;
    // } query_file;

    // struct {
    //     uint32_t enable_after_samples;
    //     uint32_t slots;
    //     uint32_t sampled;
    //     uint32_t unsampled;
    //     uint32_t estimated;
    // } samples;

    // struct {
    //     uint32_t enable_after_samples;
    //     uint32_t every;
    //     uint32_t skipped;
    //     uint32_t recalibrate;
    //     uint32_t sampled;
    //     uint32_t unsampled;
    //     uint32_t estimated;
    // } samples_per_file;

    // struct {
    //     usec_t start_ut;
    //     usec_t end_ut;
    //     usec_t step_ut;
    //     uint32_t enable_after_samples;
    //     uint32_t sampled[SYSTEMD_JOURNAL_SAMPLING_SLOTS];
    //     uint32_t unsampled[SYSTEMD_JOURNAL_SAMPLING_SLOTS];
    // } samples_per_time_slot;

    // per file progress info
    // size_t cached_count;

    // progress statistics
    usec_t matches_setup_ut;
    size_t rows_useful;
    size_t rows_read;
    size_t bytes_read;
    size_t files_matched;
    size_t file_working;
};

// prepare LQS
#define LQS_DEFAULT_SLICE_MODE      0
#define LQS_FUNCTION_NAME           WEVT_FUNCTION_NAME
#define LQS_FUNCTION_DESCRIPTION    WEVT_FUNCTION_DESCRIPTION
#define LQS_DEFAULT_ITEMS_PER_QUERY 200
#define LQS_DEFAULT_ITEMS_SAMPLING  1000000
#define LQS_SOURCE_TYPE             WEVT_SOURCE_TYPE
#define LQS_SOURCE_TYPE_ALL         WEVTS_ALL
#define LQS_SOURCE_TYPE_NONE        WEVTS_NONE
#define LQS_PARAMETER_SOURCE_NAME   "Event Channels" // this is how it is shown to users
#define LQS_FUNCTION_GET_INTERNAL_SOURCE_TYPE(value) WEVT_SOURCE_TYPE_2id_one(value)
#define LQS_FUNCTION_SOURCE_TO_JSON_ARRAY(wb) wevt_sources_to_json_array(wb)
#include "libnetdata/facets/logs_query_status.h"

#include "windows-events-query-builder.h" // needs the LQS definition, so it has to be last

#endif //NETDATA_WINDOWS_EVENTS_H