mirror of
https://github.com/rwinkhart/go-winio.git
synced 2026-09-05 16:47:31 -04:00
Add a simple tool to generate provider ID's
Also implements the Stringer interface for etw.Provider to output the ID Signed-off-by: Justin Terry (VM) <juterry@microsoft.com>
This commit is contained in:
@@ -4,6 +4,8 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode/utf16"
|
"unicode/utf16"
|
||||||
|
|
||||||
@@ -25,6 +27,23 @@ type Provider struct {
|
|||||||
keywordAll uint64
|
keywordAll uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// String returns the `provider`.ID as a string
|
||||||
|
func (provider *Provider) String() string {
|
||||||
|
data1 := make([]byte, 4)
|
||||||
|
binary.BigEndian.PutUint32(data1, provider.ID.Data1)
|
||||||
|
data2 := make([]byte, 2)
|
||||||
|
binary.BigEndian.PutUint16(data2, provider.ID.Data2)
|
||||||
|
data3 := make([]byte, 2)
|
||||||
|
binary.BigEndian.PutUint16(data3, provider.ID.Data3)
|
||||||
|
return fmt.Sprintf(
|
||||||
|
"%s-%s-%s-%s-%s",
|
||||||
|
hex.EncodeToString(data1),
|
||||||
|
hex.EncodeToString(data2),
|
||||||
|
hex.EncodeToString(data3),
|
||||||
|
hex.EncodeToString(provider.ID.Data4[:2]),
|
||||||
|
hex.EncodeToString(provider.ID.Data4[2:]))
|
||||||
|
}
|
||||||
|
|
||||||
type providerHandle windows.Handle
|
type providerHandle windows.Handle
|
||||||
|
|
||||||
// ProviderState informs the provider EnableCallback what action is being
|
// ProviderState informs the provider EnableCallback what action is being
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"encoding/binary"
|
|
||||||
"encoding/hex"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
@@ -18,22 +16,6 @@ func callback(sourceID *windows.GUID, state etw.ProviderState, level etw.Level,
|
|||||||
fmt.Printf("Callback: isEnabled=%d, level=%d, matchAnyKeyword=%d\n", state, level, matchAnyKeyword)
|
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() {
|
func main() {
|
||||||
provider, err := etw.NewProvider("TestProvider", callback)
|
provider, err := etw.NewProvider("TestProvider", callback)
|
||||||
|
|
||||||
@@ -47,7 +29,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
fmt.Println("Provider ID:", guidToString(provider.ID))
|
fmt.Printf("Provider ID: %s\n", provider)
|
||||||
|
|
||||||
reader := bufio.NewReader(os.Stdin)
|
reader := bufio.NewReader(os.Stdin)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/Microsoft/go-winio/internal/etw"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var pn = flag.String("provider-name", "", "The human readable ETW provider name to be converted into GUID format")
|
||||||
|
flag.Parse()
|
||||||
|
if pn == nil || *pn == "" {
|
||||||
|
fmt.Fprint(os.Stderr, "--provider-name is required")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
p, err := etw.NewProvider(*pn, nil)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "failed to convert provider-name: '%s' with err: '%s", *pn, err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
defer p.Close()
|
||||||
|
fmt.Fprintf(os.Stdout, "%s", p)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user