Skip to content

Commit

Permalink
Merge pull request #107 from Microsoft/etw_generator
Browse files Browse the repository at this point in the history
Add a simple tool to generate provider ID's
  • Loading branch information
jterry75 authored Jan 16, 2019
2 parents 6c8aa41 + 950c571 commit 16cfc97
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 19 deletions.
19 changes: 19 additions & 0 deletions internal/etw/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"bytes"
"crypto/sha1"
"encoding/binary"
"encoding/hex"
"fmt"
"strings"
"unicode/utf16"

Expand All @@ -25,6 +27,23 @@ type Provider struct {
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

// ProviderState informs the provider EnableCallback what action is being
Expand Down
20 changes: 1 addition & 19 deletions internal/etw/sample/sample.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package main

import (
"bufio"
"encoding/binary"
"encoding/hex"
"fmt"
"os"

Expand All @@ -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)
}

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)

Expand All @@ -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)

Expand Down
25 changes: 25 additions & 0 deletions tools/etw-provider-gen/main.go
Original file line number Diff line number Diff line change
@@ -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)
}

0 comments on commit 16cfc97

Please sign in to comment.