private unsafe uint EtwNotificationCallback(uint requestCode, IntPtr context, IntPtr bufferSize, byte *buffer) { if (null == buffer) { return(uint.MaxValue); } if (DebugTrace.Info) { DebugTrace.Trace(TraceLevel.Info, "EtwNotificationCallback is called!"); } EventTraceHeader *headerPtr = (EventTraceHeader *)buffer; switch (requestCode) { case 4: { this.traceHandle = headerPtr->HistoricalContext; uint traceEnableFlags = EtwNativeMethods.GetTraceEnableFlags(this.traceHandle); int traceEnableLevel = EtwNativeMethods.GetTraceEnableLevel(this.traceHandle); if (DebugTrace.Info) { DebugTrace.Trace(TraceLevel.Info, "EtwNotificationCallback: EnableEvents: Current DiagnosticTrace Level {0}", DiagnosticUtility.Level); DebugTrace.Trace(TraceLevel.Info, "EtwNotificationCallback: EnableEvents: flags = {0} , level = {1}", traceEnableFlags, traceEnableLevel); } using (Process process = Process.GetCurrentProcess()) { if ((traceEnableFlags == process.Id) && (traceEnableLevel > 0)) { DiagnosticUtility.Level = this.LevelFromInt(traceEnableLevel); if (DebugTrace.Info) { DebugTrace.Trace(TraceLevel.Info, "EtwNotificationCallback: New DiagnosticTrace Level {0}", DiagnosticUtility.Level); } } break; } } case 5: this.traceHandle = 0L; if (DebugTrace.Info) { DebugTrace.Trace(TraceLevel.Info, "EtwNotificationCallback: Disabling Session Handle!!"); } break; } return(0); }
unsafe uint EtwNotificationCallback(uint requestCode, System.IntPtr context, System.IntPtr bufferSize, byte *buffer) { if (null == buffer) { //note that the return value will be ignored return(uint.MaxValue); } EventTraceHeader *eventBuffer = (EventTraceHeader *)buffer; switch (requestCode) { case RequestCodes.EnableEvents: this.traceHandle = eventBuffer->HistoricalContext; int flags = EtwNativeMethods.GetTraceEnableFlags((ulong)this.traceHandle); int level = EtwNativeMethods.GetTraceEnableLevel((ulong)this.traceHandle); using (Process process = Process.GetCurrentProcess()) { if (flags == process.Id) { //TODO, vadim, if the listener is private, forward the level //if not, consider using TraceFilter //Level = LevelFromInt(level); } } break; case RequestCodes.DisableEvents: this.traceHandle = 0; break; default: this.traceHandle = 0; break; } return(0); }