Skip to content

Commit d06e2c0

Browse files
Copilotbrianrob
andcommitted
Implement CaptureState keyword merging fix
Query existing provider keywords and merge with requested keywords before CaptureState. Enables provider with merged keywords if necessary to ensure CaptureState works even when using keywords that haven't been previously enabled. Co-authored-by: brianrob <[email protected]>
1 parent d830301 commit d06e2c0

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

src/TraceEvent/TraceEventSession.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,22 @@ public void CaptureState(Guid providerGuid, ulong matchAnyKeywords = ulong.MaxVa
11161116
asArray[6] = (byte)(longVal >> 48);
11171117
asArray[7] = (byte)(longVal >> 56);
11181118
}
1119+
// Query existing keywords and merge them with requested keywords before capture state
1120+
ulong mergedKeywords = matchAnyKeywords;
1121+
Guid* providerPtr = stackalloc Guid[1];
1122+
*providerPtr = providerGuid;
1123+
long? existingKeywords = GetEnabledKeywordsForProviderAndSession(providerPtr, (ulong)m_SessionId);
1124+
if (existingKeywords.HasValue)
1125+
{
1126+
mergedKeywords = matchAnyKeywords | (ulong)existingKeywords.Value;
1127+
1128+
// Enable the provider with merged keywords first
1129+
int enableHr = TraceEventNativeMethods.EnableTraceEx2(
1130+
m_SessionHandle, providerGuid, TraceEventNativeMethods.EVENT_CONTROL_CODE_ENABLE_PROVIDER,
1131+
TraceEventLevel.Verbose, mergedKeywords, 0, EnableProviderTimeoutMSec, parameters);
1132+
Marshal.ThrowExceptionForHR(TraceEventNativeMethods.GetHRFromWin32(enableHr));
1133+
}
1134+
11191135
fixed (byte* filterDataPtr = asArray)
11201136
{
11211137
if (asArray != null)
@@ -1125,9 +1141,10 @@ public void CaptureState(Guid providerGuid, ulong matchAnyKeywords = ulong.MaxVa
11251141
filter.Size = asArray.Length;
11261142
filter.Ptr = filterDataPtr;
11271143
}
1144+
11281145
int hr = TraceEventNativeMethods.EnableTraceEx2(
11291146
m_SessionHandle, providerGuid, TraceEventNativeMethods.EVENT_CONTROL_CODE_CAPTURE_STATE,
1130-
TraceEventLevel.Verbose, matchAnyKeywords, 0, EnableProviderTimeoutMSec, parameters);
1147+
TraceEventLevel.Verbose, mergedKeywords, 0, EnableProviderTimeoutMSec, parameters);
11311148
Marshal.ThrowExceptionForHR(TraceEventNativeMethods.GetHRFromWin32(hr));
11321149
}
11331150
}

0 commit comments

Comments
 (0)