diff options
Diffstat (limited to 'src/mscorlib/src/System/Diagnostics/Eventing/EventProvider.cs')
-rw-r--r-- | src/mscorlib/src/System/Diagnostics/Eventing/EventProvider.cs | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/mscorlib/src/System/Diagnostics/Eventing/EventProvider.cs b/src/mscorlib/src/System/Diagnostics/Eventing/EventProvider.cs index ce0fcb6acb..1da6a46707 100644 --- a/src/mscorlib/src/System/Diagnostics/Eventing/EventProvider.cs +++ b/src/mscorlib/src/System/Diagnostics/Eventing/EventProvider.cs @@ -8,7 +8,9 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Runtime.InteropServices; using System.Security; +#if !CORECLR using System.Security.Permissions; +#endif // !CORECLR using System.Threading; using System; @@ -43,7 +45,9 @@ namespace System.Diagnostics.Tracing /// Only here because System.Diagnostics.EventProvider needs one more extensibility hook (when it gets a /// controller callback) /// </summary> +#if !CORECLR [System.Security.Permissions.HostProtection(MayLeakOnAbort = true)] +#endif // CORECLR internal partial class EventProvider : IDisposable { // This is the windows EVENT_DATA_DESCRIPTOR structure. We expose it because this is what @@ -341,9 +345,10 @@ namespace System.Diagnostics.Tracing { List<SessionInfo> liveSessionList = null; - GetSessionInfo((Action<int, long>) - ((etwSessionId, matchAllKeywords) => - GetSessionInfoCallback(etwSessionId, matchAllKeywords, ref liveSessionList))); + GetSessionInfo( + (int etwSessionId, long matchAllKeywords, ref List<SessionInfo> sessionList) => + GetSessionInfoCallback(etwSessionId, matchAllKeywords, ref sessionList), + ref liveSessionList); List<Tuple<SessionInfo, bool>> changedSessionList = new List<Tuple<SessionInfo, bool>>(); @@ -407,12 +412,14 @@ namespace System.Diagnostics.Tracing } } + private delegate void SessionInfoCallback(int etwSessionId, long matchAllKeywords, ref List<SessionInfo> sessionList); + /// <summary> /// This method enumerates over all active ETW sessions that have enabled 'this.m_Guid' /// for the current process ID, calling 'action' for each session, and passing it the /// ETW session and the 'AllKeywords' the session enabled for the current provider. /// </summary> - private unsafe void GetSessionInfo(Action<int, long> action) + private unsafe void GetSessionInfo(SessionInfoCallback action, ref List<SessionInfo> sessionList) { // We wish the EventSource package to be legal for Windows Store applications. // Currently EnumerateTraceGuidsEx is not an allowed API, so we avoid its use here @@ -453,7 +460,7 @@ namespace System.Diagnostics.Tracing var enabledInfos = (UnsafeNativeMethods.ManifestEtw.TRACE_ENABLE_INFO*)&providerInstance[1]; // iterate over the list of active ETW sessions "listening" to the current provider for (int j = 0; j < providerInstance->EnableCount; j++) - action(enabledInfos[j].LoggerId, enabledInfos[j].MatchAllKeyword); + action(enabledInfos[j].LoggerId, enabledInfos[j].MatchAllKeyword, ref sessionList); } if (providerInstance->NextOffset == 0) break; @@ -503,7 +510,7 @@ namespace System.Diagnostics.Tracing string keywordBitString = dataAsString.Substring(startIdx, endIdx-startIdx); int keywordBit; if (0 < endIdx && int.TryParse(keywordBitString, out keywordBit)) - action(etwSessionId, 1L << keywordBit); + action(etwSessionId, 1L << keywordBit, ref sessionList); } } } @@ -556,7 +563,9 @@ namespace System.Diagnostics.Tracing string valueName = "ControllerData_Session_" + etwSessionId.ToString(CultureInfo.InvariantCulture); // we need to assert this permission for partial trust scenarios +#if !CORECLR (new RegistryPermission(RegistryPermissionAccess.Read, regKey)).Assert(); +#endif data = Microsoft.Win32.Registry.GetValue(regKey, valueName, null) as byte[]; if (data != null) { |