mirror of
https://github.com/rwinkhart/go-winio.git
synced 2026-09-05 16:47:31 -04:00
Address PR feedback
This commit is contained in:
+1
-1
@@ -76,7 +76,7 @@ func NewEventDescriptor() *EventDescriptor {
|
|||||||
// EventDescriptor, and field metadata). Only the lower 24 bits of this value
|
// EventDescriptor, and field metadata). Only the lower 24 bits of this value
|
||||||
// are relevant.
|
// are relevant.
|
||||||
func (ed *EventDescriptor) Identity() uint32 {
|
func (ed *EventDescriptor) Identity() uint32 {
|
||||||
return (uint32(ed.version) << 16) & uint32(ed.id)
|
return (uint32(ed.version) << 16) | uint32(ed.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetIdentity sets the identity of the event. If the identity is not 0, it
|
// SetIdentity sets the identity of the event. If the identity is not 0, it
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package etw
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// EventData maintains a buffer which builds up the data for an ETW event. It
|
// EventData maintains a buffer which builds up the data for an ETW event. It
|
||||||
@@ -18,6 +17,6 @@ func NewEventData() *EventData {
|
|||||||
|
|
||||||
// AddString appends the data for a string to the end of the buffer.
|
// AddString appends the data for a string to the end of the buffer.
|
||||||
func (ed *EventData) AddString(data string) {
|
func (ed *EventData) AddString(data string) {
|
||||||
binary.Write(&ed.buffer, binary.LittleEndian, []byte(data))
|
ed.buffer.Write([]byte(data))
|
||||||
binary.Write(&ed.buffer, binary.LittleEndian, byte(0))
|
ed.buffer.WriteByte(0)
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-17
@@ -21,7 +21,7 @@ const (
|
|||||||
// (e.g. don't use multiple provider names with the same ID, or vice versa).
|
// (e.g. don't use multiple provider names with the same ID, or vice versa).
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
handle providerHandle
|
handle providerHandle
|
||||||
metadata *bytes.Buffer
|
metadata []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
type providerHandle windows.Handle
|
type providerHandle windows.Handle
|
||||||
@@ -52,17 +52,19 @@ type eventDataDescriptor struct {
|
|||||||
reserved2 uint16
|
reserved2 uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
func (descriptor *eventDataDescriptor) set(dataType eventDataDescriptorType, buffer *bytes.Buffer) {
|
func (descriptor *eventDataDescriptor) set(dataType eventDataDescriptorType, buffer []byte) {
|
||||||
// Passing a pointer to Go-managed memory as part of a block of memory is
|
// Passing a pointer to Go-managed memory as part of a block of memory is
|
||||||
// risky since the GC doesn't know about it. If we find a better way to do
|
// risky since the GC doesn't know about it. If we find a better way to do
|
||||||
// this we should use it instead.
|
// this we should use it instead.
|
||||||
descriptor.ptr = uint64(uintptr(unsafe.Pointer(&buffer.Bytes()[0])))
|
descriptor.ptr = uint64(uintptr(unsafe.Pointer(&buffer[0])))
|
||||||
descriptor.size = uint32(buffer.Len())
|
descriptor.size = uint32(len(buffer))
|
||||||
descriptor.dataType = dataType
|
descriptor.dataType = dataType
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewProvider creates and registers a new provider.
|
// NewProvider creates and registers a new provider.
|
||||||
func NewProvider(name string, id *windows.GUID, callback EnableCallback) (*Provider, error) {
|
func NewProvider(name string, id *windows.GUID, callback EnableCallback) (*Provider, error) {
|
||||||
|
provider := &Provider{}
|
||||||
|
|
||||||
innerCallback := func(sourceID *windows.GUID, state ProviderState, level Level, matchAnyKeyword uint64, matchAllKeyword uint64, filterData uintptr, _ uintptr) uintptr {
|
innerCallback := func(sourceID *windows.GUID, state ProviderState, level Level, matchAnyKeyword uint64, matchAllKeyword uint64, filterData uintptr, _ uintptr) uintptr {
|
||||||
if callback != nil {
|
if callback != nil {
|
||||||
callback(sourceID, state, level, matchAnyKeyword, matchAllKeyword, filterData)
|
callback(sourceID, state, level, matchAnyKeyword, matchAllKeyword, filterData)
|
||||||
@@ -70,21 +72,18 @@ func NewProvider(name string, id *windows.GUID, callback EnableCallback) (*Provi
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
var providerHandle providerHandle
|
if err := eventRegister(id, windows.NewCallback(innerCallback), 0, &provider.handle); err != nil {
|
||||||
if err := eventRegister(id, windows.NewCallback(innerCallback), 0, &providerHandle); err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var metadataBuffer bytes.Buffer
|
metadata := &bytes.Buffer{}
|
||||||
binary.Write(&metadataBuffer, binary.LittleEndian, uint16(0)) // Write empty size for buffer (to update later)
|
binary.Write(metadata, binary.LittleEndian, uint16(0)) // Write empty size for buffer (to update later)
|
||||||
binary.Write(&metadataBuffer, binary.LittleEndian, []byte(name)) // Provider name
|
metadata.WriteString(name) // Provider name
|
||||||
binary.Write(&metadataBuffer, binary.LittleEndian, byte(0)) // Null terminator for name
|
metadata.WriteByte(0) // Null terminator for name
|
||||||
binary.LittleEndian.PutUint16(metadataBuffer.Bytes(), uint16(metadataBuffer.Len())) // Update the size at the beginning of the buffer
|
binary.LittleEndian.PutUint16(metadata.Bytes(), uint16(metadata.Len())) // Update the size at the beginning of the buffer
|
||||||
|
provider.metadata = metadata.Bytes()
|
||||||
|
|
||||||
return &Provider{
|
return provider, nil
|
||||||
handle: providerHandle,
|
|
||||||
metadata: &metadataBuffer,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close unregisters the provider.
|
// Close unregisters the provider.
|
||||||
@@ -100,8 +99,8 @@ func (provider *Provider) WriteEvent(event *Event) error {
|
|||||||
|
|
||||||
var dataDescriptors [3]eventDataDescriptor
|
var dataDescriptors [3]eventDataDescriptor
|
||||||
dataDescriptors[0].set(eventDataDescriptorTypeProviderMetadata, provider.metadata)
|
dataDescriptors[0].set(eventDataDescriptorTypeProviderMetadata, provider.metadata)
|
||||||
dataDescriptors[1].set(eventDataDescriptorTypeEventMetadata, &event.Metadata.buffer)
|
dataDescriptors[1].set(eventDataDescriptorTypeEventMetadata, event.Metadata.buffer.Bytes())
|
||||||
dataDescriptors[2].set(eventDataDescriptorTypeUserData, &event.Data.buffer)
|
dataDescriptors[2].set(eventDataDescriptorTypeUserData, event.Data.buffer.Bytes())
|
||||||
|
|
||||||
return eventWriteTransfer(provider.handle, event.Descriptor, nil, nil, 3, &dataDescriptors[0])
|
return eventWriteTransfer(provider.handle, event.Descriptor, nil, nil, 3, &dataDescriptors[0])
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user