@@ -118,6 +118,8 @@ func (c *Consumer) rawEventCallback(eventRecord *advapi32.EventRecord) uintptr {
118
118
return 1
119
119
}
120
120
121
+ channelName , opcodeName , taskName , eventID := c .getEventInfoFromRecord (eventRecord )
122
+
121
123
// Create an XML-like representation
122
124
var xmlBuilder strings.Builder
123
125
xmlBuilder .WriteString ("<Event>\n " )
@@ -127,24 +129,38 @@ func (c *Consumer) rawEventCallback(eventRecord *advapi32.EventRecord) uintptr {
127
129
xmlBuilder .WriteString (fmt .Sprintf (" <Provider Name=\" %s\" Guid=\" {%s}\" />\n " ,
128
130
providerName , providerGUID ))
129
131
xmlBuilder .WriteString (fmt .Sprintf (" <EventID>%d</EventID>\n " ,
130
- eventRecord . EventHeader . EventDescriptor . Id ))
132
+ eventID ))
131
133
xmlBuilder .WriteString (fmt .Sprintf (" <Version>%d</Version>\n " ,
132
134
eventRecord .EventHeader .EventDescriptor .Version ))
133
135
xmlBuilder .WriteString (fmt .Sprintf (" <Level>%d</Level>\n " ,
134
136
eventRecord .EventHeader .EventDescriptor .Level ))
135
- xmlBuilder .WriteString (fmt .Sprintf (" <Task>%d </Task>\n " ,
136
- eventRecord . EventHeader . EventDescriptor . Task ))
137
- xmlBuilder .WriteString (fmt .Sprintf (" <Opcode>%d </Opcode>\n " ,
138
- eventRecord . EventHeader . EventDescriptor . Opcode ))
137
+ xmlBuilder .WriteString (fmt .Sprintf (" <Task>%s </Task>\n " ,
138
+ taskName ))
139
+ xmlBuilder .WriteString (fmt .Sprintf (" <Opcode>%s </Opcode>\n " ,
140
+ opcodeName ))
139
141
xmlBuilder .WriteString (fmt .Sprintf (" <Keywords>0x%x</Keywords>\n " ,
140
142
eventRecord .EventHeader .EventDescriptor .Keyword ))
141
143
142
144
timeStr := eventRecord .EventHeader .UTC ().Format (time .RFC3339Nano )
143
145
xmlBuilder .WriteString (fmt .Sprintf (" <TimeCreated SystemTime=\" %s\" />\n " , timeStr ))
144
146
147
+ if ! eventRecord .EventHeader .ActivityId .Equals (& windows.GUID {}) {
148
+ xmlBuilder .WriteString (fmt .Sprintf (" <Correlation ActivityID=\" %s\" RelatedActivityID=\" %s\" />\n " ,
149
+ eventRecord .EventHeader .ActivityId .String (), eventRecord .RelatedActivityID ()))
150
+ } else {
151
+ xmlBuilder .WriteString (" <Correlation />\n " )
152
+ }
153
+
145
154
xmlBuilder .WriteString (fmt .Sprintf (" <Execution ProcessID=\" %d\" ThreadID=\" %d\" />\n " ,
146
155
eventRecord .EventHeader .ProcessId , eventRecord .EventHeader .ThreadId ))
156
+
157
+ xmlBuilder .WriteString (fmt .Sprintf (" <Channel>%s</Channel>\n " , channelName ))
158
+
147
159
xmlBuilder .WriteString (fmt .Sprintf (" <Computer>%s</Computer>\n " , hostname ))
160
+
161
+ if sid := eventRecord .SID (); sid != "" {
162
+ xmlBuilder .WriteString (fmt .Sprintf (" <Security UserID=\" %s\" />\n " , sid ))
163
+ }
148
164
xmlBuilder .WriteString (" </System>\n " )
149
165
150
166
// EventData section
@@ -188,38 +204,50 @@ func (c *Consumer) parsedEventCallback(eventRecord *advapi32.EventRecord) uintpt
188
204
if provider , ok := c .providerMap [providerGUID ]; ok {
189
205
providerName = provider .Name
190
206
}
207
+
208
+ // Get event information from TraceEventInfo
209
+ channelName , opcodeName , taskName , eventID := c .getEventInfoFromRecord (eventRecord )
210
+
191
211
level := eventRecord .EventHeader .EventDescriptor .Level
192
212
event := & Event {
193
213
Flags : strconv .FormatUint (uint64 (eventRecord .EventHeader .Flags ), 10 ),
194
214
Session : c .sessionName ,
195
215
Timestamp : parseTimestamp (uint64 (eventRecord .EventHeader .TimeStamp )),
196
216
System : EventSystem {
197
217
ActivityID : eventRecord .EventHeader .ActivityId .String (),
198
- Channel : strconv . FormatInt ( int64 ( eventRecord . EventHeader . EventDescriptor . Channel ), 10 ) ,
199
- Keywords : strconv .FormatUint (eventRecord .EventHeader .EventDescriptor .Keyword , 10 ),
200
- EventID : fmt . Sprintf ( "%d" , eventRecord . EventHeader . EventDescriptor . Id ),
201
- Opcode : strconv . FormatUint ( uint64 ( eventRecord . EventHeader . EventDescriptor . Opcode ), 10 ) ,
202
- Task : strconv . FormatUint ( uint64 ( eventRecord . EventHeader . EventDescriptor . Task ), 10 ) ,
218
+ Channel : channelName ,
219
+ Keywords : strconv .FormatUint (uint64 ( eventRecord .EventHeader .EventDescriptor .Keyword ) , 10 ),
220
+ EventID : strconv . FormatUint ( uint64 ( eventID ), 10 ),
221
+ Opcode : opcodeName ,
222
+ Task : taskName ,
203
223
Provider : EventProvider {
204
224
GUID : providerGUID ,
205
225
Name : providerName ,
206
226
},
207
- Level : level ,
208
- Computer : hostname ,
209
- Correlation : EventCorrelation {
210
- ActivityID : eventRecord .EventHeader .ActivityId .String (),
211
- RelatedActivityID : eventRecord .RelatedActivityID (),
212
- },
227
+ Level : level ,
228
+ Computer : hostname ,
229
+ Correlation : EventCorrelation {},
213
230
Execution : EventExecution {
214
231
ThreadID : eventRecord .EventHeader .ThreadId ,
215
232
ProcessID : eventRecord .EventHeader .ProcessId ,
216
233
},
217
234
Version : eventRecord .EventHeader .EventDescriptor .Version ,
218
235
},
236
+ Security : EventSecurity {
237
+ SID : eventRecord .SID (),
238
+ },
219
239
EventData : data ,
220
240
ExtendedData : []string {},
221
241
}
222
242
243
+ if activityID := eventRecord .EventHeader .ActivityId .String (); activityID != zeroGUID {
244
+ event .System .Correlation .ActivityID = activityID
245
+ }
246
+
247
+ if relatedActivityID := eventRecord .RelatedActivityID (); relatedActivityID != zeroGUID {
248
+ event .System .Correlation .RelatedActivityID = relatedActivityID
249
+ }
250
+
223
251
select {
224
252
case c .Events <- event :
225
253
return 0
@@ -228,6 +256,15 @@ func (c *Consumer) parsedEventCallback(eventRecord *advapi32.EventRecord) uintpt
228
256
}
229
257
}
230
258
259
+ func (c * Consumer ) getEventInfoFromRecord (eventRecord * advapi32.EventRecord ) (channelName string , opcodeName string , taskName string , eventID uint16 ) {
260
+ ti , err := getEventInformation (eventRecord )
261
+ if err != nil {
262
+ c .logger .Error ("Failed to get event information" , zap .Error (err ))
263
+ return "" , "" , "" , 0
264
+ }
265
+ return ti .ChannelName (), ti .OpcodeName (), ti .TaskName (), ti .EventID ()
266
+ }
267
+
231
268
func (c * Consumer ) defaultBufferCallback (buffer * advapi32.EventTraceLogfile ) uintptr {
232
269
select {
233
270
case <- c .doneChan :
0 commit comments