summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/Diagnostics/Eventing/EventProvider.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/Diagnostics/Eventing/EventProvider.cs')
-rw-r--r--src/mscorlib/src/System/Diagnostics/Eventing/EventProvider.cs21
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)
{