Skip to content

Commit

Permalink
Merge pull request #214 from kylewo/master
Browse files Browse the repository at this point in the history
Fix corruption in x86 callback
  • Loading branch information
kevpar authored Jul 20, 2021
2 parents 1d4efac + 0b148d1 commit 8f85a06
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 9 deletions.
9 changes: 0 additions & 9 deletions pkg/etw/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,6 @@ func providerCallback(sourceID guid.GUID, state ProviderState, level Level, matc
}
}

// providerCallbackAdapter acts as the first-level callback from the C/ETW side
// for provider notifications. Because Go has trouble with callback arguments of
// different size, it has only pointer-sized arguments, which are then cast to
// the appropriate types when calling providerCallback.
func providerCallbackAdapter(sourceID *guid.GUID, state uintptr, level uintptr, matchAnyKeyword uintptr, matchAllKeyword uintptr, filterData uintptr, i uintptr) uintptr {
providerCallback(*sourceID, ProviderState(state), Level(level), uint64(matchAnyKeyword), uint64(matchAllKeyword), filterData, i)
return 0
}

// providerIDFromName generates a provider ID based on the provider name. It
// uses the same algorithm as used by .NET's EventSource class, which is based
// on RFC 4122. More information on the algorithm can be found here:
Expand Down
15 changes: 15 additions & 0 deletions pkg/etw/wrapper_32.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package etw

import (
"github.com/Microsoft/go-winio/pkg/guid"
"golang.org/x/sys/windows"
)

Expand Down Expand Up @@ -50,3 +51,17 @@ func eventSetInformation(
information,
length)
}

// providerCallbackAdapter acts as the first-level callback from the C/ETW side
// for provider notifications. Because Go has trouble with callback arguments of
// different size, it has only pointer-sized arguments, which are then cast to
// the appropriate types when calling providerCallback.
// For x86, the matchAny and matchAll keywords need to be assembled from two
// 32-bit integers, because the max size of an argument is uintptr, but those
// two arguments are actually 64-bit integers.
func providerCallbackAdapter(sourceID *guid.GUID, state uint32, level uint8, matchAnyKeyword_low uint32, matchAnyKeyword_high uint32, matchAllKeyword_low uint32, matchAllKeyword_high uint32, filterData uintptr, i uintptr) uintptr {
matchAnyKeyword := uint64(matchAnyKeyword_high) << 32 | uint64(matchAnyKeyword_low)
matchAllKeyword := uint64(matchAllKeyword_high) << 32 | uint64(matchAllKeyword_low)
providerCallback(*sourceID, ProviderState(state), Level(level), uint64(matchAnyKeyword), uint64(matchAllKeyword), filterData, i)
return 0
}
10 changes: 10 additions & 0 deletions pkg/etw/wrapper_64.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package etw

import (
"github.com/Microsoft/go-winio/pkg/guid"
"golang.org/x/sys/windows"
)

Expand Down Expand Up @@ -40,3 +41,12 @@ func eventSetInformation(
information,
length)
}

// providerCallbackAdapter acts as the first-level callback from the C/ETW side
// for provider notifications. Because Go has trouble with callback arguments of
// different size, it has only pointer-sized arguments, which are then cast to
// the appropriate types when calling providerCallback.
func providerCallbackAdapter(sourceID *guid.GUID, state uint32, level uint8, matchAnyKeyword uintptr, matchAllKeyword uintptr, filterData uintptr, i uintptr) uintptr {
providerCallback(*sourceID, ProviderState(state), Level(level), uint64(matchAnyKeyword), uint64(matchAllKeyword), filterData, i)
return 0
}

0 comments on commit 8f85a06

Please sign in to comment.