-
Notifications
You must be signed in to change notification settings - Fork 181
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #110 from Microsoft/jjh/lineendings
Convert to Uix line endings
- Loading branch information
Showing
14 changed files
with
1,500 additions
and
1,500 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,15 @@ | ||
// Package etw provides support for TraceLogging-based ETW (Event Tracing | ||
// for Windows). TraceLogging is a format of ETW events that are self-describing | ||
// (the event contains information on its own schema). This allows them to be | ||
// decoded without needing a separate manifest with event information. The | ||
// implementation here is based on the information found in | ||
// TraceLoggingProvider.h in the Windows SDK, which implements TraceLogging as a | ||
// set of C macros. | ||
package etw | ||
|
||
//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go etw.go | ||
|
||
//sys eventRegister(providerId *windows.GUID, callback uintptr, callbackContext uintptr, providerHandle *providerHandle) (win32err error) = advapi32.EventRegister | ||
//sys eventUnregister(providerHandle providerHandle) (win32err error) = advapi32.EventUnregister | ||
//sys eventWriteTransfer(providerHandle providerHandle, descriptor *EventDescriptor, activityID *windows.GUID, relatedActivityID *windows.GUID, dataDescriptorCount uint32, dataDescriptors *eventDataDescriptor) (win32err error) = advapi32.EventWriteTransfer | ||
//sys eventSetInformation(providerHandle providerHandle, class eventInfoClass, information uintptr, length uint32) (win32err error) = advapi32.EventSetInformation | ||
// Package etw provides support for TraceLogging-based ETW (Event Tracing | ||
// for Windows). TraceLogging is a format of ETW events that are self-describing | ||
// (the event contains information on its own schema). This allows them to be | ||
// decoded without needing a separate manifest with event information. The | ||
// implementation here is based on the information found in | ||
// TraceLoggingProvider.h in the Windows SDK, which implements TraceLogging as a | ||
// set of C macros. | ||
package etw | ||
|
||
//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go etw.go | ||
|
||
//sys eventRegister(providerId *windows.GUID, callback uintptr, callbackContext uintptr, providerHandle *providerHandle) (win32err error) = advapi32.EventRegister | ||
//sys eventUnregister(providerHandle providerHandle) (win32err error) = advapi32.EventUnregister | ||
//sys eventWriteTransfer(providerHandle providerHandle, descriptor *EventDescriptor, activityID *windows.GUID, relatedActivityID *windows.GUID, dataDescriptorCount uint32, dataDescriptors *eventDataDescriptor) (win32err error) = advapi32.EventWriteTransfer | ||
//sys eventSetInformation(providerHandle providerHandle, class eventInfoClass, information uintptr, length uint32) (win32err error) = advapi32.EventSetInformation |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,65 +1,65 @@ | ||
package etw | ||
|
||
import ( | ||
"bytes" | ||
"encoding/binary" | ||
) | ||
|
||
// EventData maintains a buffer which builds up the data for an ETW event. It | ||
// needs to be paired with EventMetadata which describes the event. | ||
type EventData struct { | ||
buffer bytes.Buffer | ||
} | ||
|
||
// Bytes returns the raw binary data containing the event data. The returned | ||
// value is not copied from the internal buffer, so it can be mutated by the | ||
// EventData object after it is returned. | ||
func (ed *EventData) Bytes() []byte { | ||
return ed.buffer.Bytes() | ||
} | ||
|
||
// WriteString appends a string, including the null terminator, to the buffer. | ||
func (ed *EventData) WriteString(data string) { | ||
ed.buffer.WriteString(data) | ||
ed.buffer.WriteByte(0) | ||
} | ||
|
||
// WriteInt8 appends a int8 to the buffer. | ||
func (ed *EventData) WriteInt8(value int8) { | ||
ed.buffer.WriteByte(uint8(value)) | ||
} | ||
|
||
// WriteInt16 appends a int16 to the buffer. | ||
func (ed *EventData) WriteInt16(value int16) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
|
||
// WriteInt32 appends a int32 to the buffer. | ||
func (ed *EventData) WriteInt32(value int32) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
|
||
// WriteInt64 appends a int64 to the buffer. | ||
func (ed *EventData) WriteInt64(value int64) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
|
||
// WriteUint8 appends a uint8 to the buffer. | ||
func (ed *EventData) WriteUint8(value uint8) { | ||
ed.buffer.WriteByte(value) | ||
} | ||
|
||
// WriteUint16 appends a uint16 to the buffer. | ||
func (ed *EventData) WriteUint16(value uint16) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
|
||
// WriteUint32 appends a uint32 to the buffer. | ||
func (ed *EventData) WriteUint32(value uint32) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
|
||
// WriteUint64 appends a uint64 to the buffer. | ||
func (ed *EventData) WriteUint64(value uint64) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
package etw | ||
|
||
import ( | ||
"bytes" | ||
"encoding/binary" | ||
) | ||
|
||
// EventData maintains a buffer which builds up the data for an ETW event. It | ||
// needs to be paired with EventMetadata which describes the event. | ||
type EventData struct { | ||
buffer bytes.Buffer | ||
} | ||
|
||
// Bytes returns the raw binary data containing the event data. The returned | ||
// value is not copied from the internal buffer, so it can be mutated by the | ||
// EventData object after it is returned. | ||
func (ed *EventData) Bytes() []byte { | ||
return ed.buffer.Bytes() | ||
} | ||
|
||
// WriteString appends a string, including the null terminator, to the buffer. | ||
func (ed *EventData) WriteString(data string) { | ||
ed.buffer.WriteString(data) | ||
ed.buffer.WriteByte(0) | ||
} | ||
|
||
// WriteInt8 appends a int8 to the buffer. | ||
func (ed *EventData) WriteInt8(value int8) { | ||
ed.buffer.WriteByte(uint8(value)) | ||
} | ||
|
||
// WriteInt16 appends a int16 to the buffer. | ||
func (ed *EventData) WriteInt16(value int16) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
|
||
// WriteInt32 appends a int32 to the buffer. | ||
func (ed *EventData) WriteInt32(value int32) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
|
||
// WriteInt64 appends a int64 to the buffer. | ||
func (ed *EventData) WriteInt64(value int64) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
|
||
// WriteUint8 appends a uint8 to the buffer. | ||
func (ed *EventData) WriteUint8(value uint8) { | ||
ed.buffer.WriteByte(value) | ||
} | ||
|
||
// WriteUint16 appends a uint16 to the buffer. | ||
func (ed *EventData) WriteUint16(value uint16) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
|
||
// WriteUint32 appends a uint32 to the buffer. | ||
func (ed *EventData) WriteUint32(value uint32) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} | ||
|
||
// WriteUint64 appends a uint64 to the buffer. | ||
func (ed *EventData) WriteUint64(value uint64) { | ||
binary.Write(&ed.buffer, binary.LittleEndian, value) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,29 @@ | ||
package etw | ||
|
||
import ( | ||
"unsafe" | ||
) | ||
|
||
type eventDataDescriptorType uint8 | ||
|
||
const ( | ||
eventDataDescriptorTypeUserData eventDataDescriptorType = iota | ||
eventDataDescriptorTypeEventMetadata | ||
eventDataDescriptorTypeProviderMetadata | ||
) | ||
|
||
type eventDataDescriptor struct { | ||
ptr ptr64 | ||
size uint32 | ||
dataType eventDataDescriptorType | ||
reserved1 uint8 | ||
reserved2 uint16 | ||
} | ||
|
||
func newEventDataDescriptor(dataType eventDataDescriptorType, buffer []byte) eventDataDescriptor { | ||
return eventDataDescriptor{ | ||
ptr: ptr64{ptr: unsafe.Pointer(&buffer[0])}, | ||
size: uint32(len(buffer)), | ||
dataType: dataType, | ||
} | ||
} | ||
package etw | ||
|
||
import ( | ||
"unsafe" | ||
) | ||
|
||
type eventDataDescriptorType uint8 | ||
|
||
const ( | ||
eventDataDescriptorTypeUserData eventDataDescriptorType = iota | ||
eventDataDescriptorTypeEventMetadata | ||
eventDataDescriptorTypeProviderMetadata | ||
) | ||
|
||
type eventDataDescriptor struct { | ||
ptr ptr64 | ||
size uint32 | ||
dataType eventDataDescriptorType | ||
reserved1 uint8 | ||
reserved2 uint16 | ||
} | ||
|
||
func newEventDataDescriptor(dataType eventDataDescriptorType, buffer []byte) eventDataDescriptor { | ||
return eventDataDescriptor{ | ||
ptr: ptr64{ptr: unsafe.Pointer(&buffer[0])}, | ||
size: uint32(len(buffer)), | ||
dataType: dataType, | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,67 +1,67 @@ | ||
package etw | ||
|
||
// Channel represents the ETW logging channel that is used. It can be used by | ||
// event consumers to give an event special treatment. | ||
type Channel uint8 | ||
|
||
const ( | ||
// ChannelTraceLogging is the default channel for TraceLogging events. It is | ||
// not required to be used for TraceLogging, but will prevent decoding | ||
// issues for these events on older operating systems. | ||
ChannelTraceLogging Channel = 11 | ||
) | ||
|
||
// Level represents the ETW logging level. There are several predefined levels | ||
// that are commonly used, but technically anything from 0-255 is allowed. | ||
// Lower levels indicate more important events, and 0 indicates an event that | ||
// will always be collected. | ||
type Level uint8 | ||
|
||
// Predefined ETW log levels. | ||
const ( | ||
LevelAlways Level = iota | ||
LevelCritical | ||
LevelError | ||
LevelWarning | ||
LevelInfo | ||
LevelVerbose | ||
) | ||
|
||
// EventDescriptor represents various metadata for an ETW event. | ||
type EventDescriptor struct { | ||
id uint16 | ||
version uint8 | ||
Channel Channel | ||
Level Level | ||
Opcode uint8 | ||
Task uint16 | ||
Keyword uint64 | ||
} | ||
|
||
// NewEventDescriptor returns an EventDescriptor initialized for use with | ||
// TraceLogging. | ||
func NewEventDescriptor() *EventDescriptor { | ||
// Standard TraceLogging events default to the TraceLogging channel, and | ||
// verbose level. | ||
return &EventDescriptor{ | ||
Channel: ChannelTraceLogging, | ||
Level: LevelVerbose, | ||
} | ||
} | ||
|
||
// Identity returns the identity of the event. If the identity is not 0, it | ||
// should uniquely identify the other event metadata (contained in | ||
// EventDescriptor, and field metadata). Only the lower 24 bits of this value | ||
// are relevant. | ||
func (ed *EventDescriptor) Identity() uint32 { | ||
return (uint32(ed.version) << 16) | uint32(ed.id) | ||
} | ||
|
||
// SetIdentity sets the identity of the event. If the identity is not 0, it | ||
// should uniquely identify the other event metadata (contained in | ||
// EventDescriptor, and field metadata). Only the lower 24 bits of this value | ||
// are relevant. | ||
func (ed *EventDescriptor) SetIdentity(identity uint32) { | ||
ed.id = uint16(identity) | ||
ed.version = uint8(identity >> 16) | ||
} | ||
package etw | ||
|
||
// Channel represents the ETW logging channel that is used. It can be used by | ||
// event consumers to give an event special treatment. | ||
type Channel uint8 | ||
|
||
const ( | ||
// ChannelTraceLogging is the default channel for TraceLogging events. It is | ||
// not required to be used for TraceLogging, but will prevent decoding | ||
// issues for these events on older operating systems. | ||
ChannelTraceLogging Channel = 11 | ||
) | ||
|
||
// Level represents the ETW logging level. There are several predefined levels | ||
// that are commonly used, but technically anything from 0-255 is allowed. | ||
// Lower levels indicate more important events, and 0 indicates an event that | ||
// will always be collected. | ||
type Level uint8 | ||
|
||
// Predefined ETW log levels. | ||
const ( | ||
LevelAlways Level = iota | ||
LevelCritical | ||
LevelError | ||
LevelWarning | ||
LevelInfo | ||
LevelVerbose | ||
) | ||
|
||
// EventDescriptor represents various metadata for an ETW event. | ||
type EventDescriptor struct { | ||
id uint16 | ||
version uint8 | ||
Channel Channel | ||
Level Level | ||
Opcode uint8 | ||
Task uint16 | ||
Keyword uint64 | ||
} | ||
|
||
// NewEventDescriptor returns an EventDescriptor initialized for use with | ||
// TraceLogging. | ||
func NewEventDescriptor() *EventDescriptor { | ||
// Standard TraceLogging events default to the TraceLogging channel, and | ||
// verbose level. | ||
return &EventDescriptor{ | ||
Channel: ChannelTraceLogging, | ||
Level: LevelVerbose, | ||
} | ||
} | ||
|
||
// Identity returns the identity of the event. If the identity is not 0, it | ||
// should uniquely identify the other event metadata (contained in | ||
// EventDescriptor, and field metadata). Only the lower 24 bits of this value | ||
// are relevant. | ||
func (ed *EventDescriptor) Identity() uint32 { | ||
return (uint32(ed.version) << 16) | uint32(ed.id) | ||
} | ||
|
||
// SetIdentity sets the identity of the event. If the identity is not 0, it | ||
// should uniquely identify the other event metadata (contained in | ||
// EventDescriptor, and field metadata). Only the lower 24 bits of this value | ||
// are relevant. | ||
func (ed *EventDescriptor) SetIdentity(identity uint32) { | ||
ed.id = uint16(identity) | ||
ed.version = uint8(identity >> 16) | ||
} |
Oops, something went wrong.