Merge pull request #123 from kevpar/etw-opcode

Add opcode support to etw package
This commit is contained in:
Kevin Parsons
2019-03-28 14:42:35 -07:00
committed by GitHub
2 changed files with 29 additions and 2 deletions
+19 -2
View File
@@ -17,7 +17,7 @@ const (
// will always be collected. // will always be collected.
type Level uint8 type Level uint8
// Predefined ETW log levels. // Predefined ETW log levels from winmeta.xml in the Windows SDK.
const ( const (
LevelAlways Level = iota LevelAlways Level = iota
LevelCritical LevelCritical
@@ -27,13 +27,30 @@ const (
LevelVerbose LevelVerbose
) )
// Opcode represents the operation that the event indicates is being performed.
type Opcode uint8
// Predefined ETW opcodes from winmeta.xml in the Windows SDK.
const (
// OpcodeInfo indicates an informational event.
OpcodeInfo Opcode = iota
// OpcodeStart indicates the start of an operation.
OpcodeStart
// OpcodeStop indicates the end of an operation.
OpcodeStop
// OpcodeDCStart indicates the start of a provider capture state operation.
OpcodeDCStart
// OpcodeDCStop indicates the end of a provider capture state operation.
OpcodeDCStop
)
// EventDescriptor represents various metadata for an ETW event. // EventDescriptor represents various metadata for an ETW event.
type eventDescriptor struct { type eventDescriptor struct {
id uint16 id uint16
version uint8 version uint8
channel Channel channel Channel
level Level level Level
opcode uint8 opcode Opcode
task uint16 task uint16
keyword uint64 keyword uint64
} }
+10
View File
@@ -36,12 +36,20 @@ func WithKeyword(keyword uint64) EventOpt {
} }
} }
// WithChannel specifies the channel of the event to be written.
func WithChannel(channel Channel) EventOpt { func WithChannel(channel Channel) EventOpt {
return func(options *eventOptions) { return func(options *eventOptions) {
options.descriptor.channel = channel options.descriptor.channel = channel
} }
} }
// WithOpcode specifies the opcode of the event to be written.
func WithOpcode(opcode Opcode) EventOpt {
return func(options *eventOptions) {
options.descriptor.opcode = opcode
}
}
// WithTags specifies the tags of the event to be written. Tags is a 28-bit // WithTags specifies the tags of the event to be written. Tags is a 28-bit
// value (top 4 bits are ignored) which are interpreted by the event consumer. // value (top 4 bits are ignored) which are interpreted by the event consumer.
func WithTags(newTags uint32) EventOpt { func WithTags(newTags uint32) EventOpt {
@@ -50,12 +58,14 @@ func WithTags(newTags uint32) EventOpt {
} }
} }
// WithActivityID specifies the activity ID of the event to be written.
func WithActivityID(activityID *windows.GUID) EventOpt { func WithActivityID(activityID *windows.GUID) EventOpt {
return func(options *eventOptions) { return func(options *eventOptions) {
options.activityID = activityID options.activityID = activityID
} }
} }
// WithRelatedActivityID specifies the parent activity ID of the event to be written.
func WithRelatedActivityID(activityID *windows.GUID) EventOpt { func WithRelatedActivityID(activityID *windows.GUID) EventOpt {
return func(options *eventOptions) { return func(options *eventOptions) {
options.relatedActivityID = activityID options.relatedActivityID = activityID