/// <summary> /// Starts the trace safe. /// </summary> /// <param name="logFileMode">The log file mode.</param> /// <param name="logFileMaxSize">Size of the log file max.</param> /// <param name="logFileName">Name of the log file.</param> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> public bool StartTraceSafe( NativeMethods.EventTraceFileMode logFileMode = NativeMethods.EventTraceFileMode.RealTime, uint logFileMaxSize = 0, string logFileName = null) { if (QueryTrace(_sessionName)) { StopTrace(_sessionName); } if (!StartTrace(logFileMode, logFileMaxSize, logFileName)) { CleanTrace(_sessionName); if (!StartTrace(logFileMode, logFileMaxSize, logFileName)) { CDFMonitor.Instance.EtwTraceClean(true); if (!StartTrace(logFileMode, logFileMaxSize, logFileName)) { return(false); } } } return(Running = true); }
/// <summary> /// Start the ETW session. /// </summary> /// <param name="logFileMode">The log file mode.</param> /// <param name="logFileMaxSize">Size of the log file max.</param> /// <param name="logFileName">Name of the log file.</param> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> public bool StartTrace(NativeMethods.EventTraceFileMode logFileMode = NativeMethods.EventTraceFileMode.RealTime, uint logFileMaxSize = 0, string logFileName = null) { Debug.Assert(_handle == 0, "_handle == 0"); NativeMethods.EventTraceProperties properties = CommonEventTraceProperties(); properties.WNode.Flags = NativeMethods.WNodeFlags.TracedGuid; properties.WNode.ClientContext = 1; properties.LogFileMode = logFileMode; properties.FlushTimer = 1; if (logFileMode != NativeMethods.EventTraceFileMode.RealTime) { properties.MaximumFileSize = logFileMaxSize; //32 bit different uint offset = 4; if (IntPtr.Size == 8) //64 bit { offset = 0; } properties.LogFileNameOffset = NativeMethods.EventTracePropertiesStructSize + (NativeMethods.EventTracePropertiesStringSize) - offset; properties.LogFileName = logFileName; properties.FlushTimer = 0; } CDFMonitor.LogOutputHandler("DEBUG:ETWController.StartTrace:starting trace."); uint processResult = NativeMethods.StartTrace(out _handle, _sessionName, ref properties); int lastError = Marshal.GetLastWin32Error(); if (!NativeMethods.IsValidHandle(_handle)) { CDFMonitor.LogOutputHandler("DEBUG:StartTrace: exception. lastError:" + lastError.ToString()); return(false); } if (processResult != NativeMethods.ERROR_SUCCESS && processResult != NativeMethods.ERROR_CANCELLED && processResult != NativeMethods.ERROR_ALREADY_EXISTS) { CDFMonitor.LogOutputHandler("StartTrace: exception. process result:" + processResult.ToString()); return(false); } return(true); }