mirror of
https://github.com/rwinkhart/go-winio.git
synced 2026-08-31 06:16:46 -04:00
80 lines
2.0 KiB
Go
80 lines
2.0 KiB
Go
// Shows a sample usage of the ETW logging package.
|
|
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/binary"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/Microsoft/go-winio/internal/etw"
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
func callback(sourceID *windows.GUID, state etw.ProviderState, level etw.Level, matchAnyKeyword uint64, matchAllKeyword uint64, filterData uintptr) {
|
|
fmt.Printf("Callback: isEnabled=%d, level=%d, matchAnyKeyword=%d\n", state, level, matchAnyKeyword)
|
|
}
|
|
|
|
func guidToString(guid *windows.GUID) string {
|
|
data1 := make([]byte, 4)
|
|
binary.BigEndian.PutUint32(data1, guid.Data1)
|
|
data2 := make([]byte, 2)
|
|
binary.BigEndian.PutUint16(data2, guid.Data2)
|
|
data3 := make([]byte, 2)
|
|
binary.BigEndian.PutUint16(data3, guid.Data3)
|
|
return fmt.Sprintf(
|
|
"%s-%s-%s-%s-%s",
|
|
hex.EncodeToString(data1),
|
|
hex.EncodeToString(data2),
|
|
hex.EncodeToString(data3),
|
|
hex.EncodeToString(guid.Data4[:2]),
|
|
hex.EncodeToString(guid.Data4[2:]))
|
|
}
|
|
|
|
func main() {
|
|
provider, err := etw.NewProvider("TestProvider", callback)
|
|
|
|
if err != nil {
|
|
logrus.Error(err)
|
|
return
|
|
}
|
|
defer func() {
|
|
if err := provider.Close(); err != nil {
|
|
logrus.Error(err)
|
|
}
|
|
}()
|
|
|
|
fmt.Println("Provider ID:", guidToString(provider.ID))
|
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
fmt.Println("Press enter to log an event")
|
|
reader.ReadString('\n')
|
|
|
|
event := etw.NewEvent("TestEvent", etw.NewEventDescriptor())
|
|
event.Metadata.AddField("TestField", etw.InTypeANSIString)
|
|
event.Data.AddString("Foo")
|
|
event.Metadata.AddField("TestField2", etw.InTypeANSIString)
|
|
event.Data.AddString("Bar")
|
|
event.Metadata.AddField("TestArray", etw.InTypeANSIString, etw.WithArray())
|
|
event.Data.AddSimple(uint16(5))
|
|
event.Data.AddString("Item1")
|
|
event.Data.AddString("Item2")
|
|
event.Data.AddString("Item3")
|
|
event.Data.AddString("Item4")
|
|
event.Data.AddString("Item5")
|
|
|
|
if err := provider.WriteEvent(event); err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
fmt.Println("Event written")
|
|
|
|
fmt.Println("Press enter to exit")
|
|
reader.ReadString('\n')
|
|
}
|