/// <summary> /// Extracts manifest from .etl file that was produced using System.Diagnostics.Tracing.EventSource /// </summary> /// <param name="etlFile">Trace file</param> /// <returns></returns> public static string[] ExtractManifests(string etlFile) { IObservable<EtwNativeEvent> all = FromFiles(etlFile); var manifests = new Dictionary<Guid, ManifestReassembly>(); var evt = new ManualResetEvent(false); IDisposable d = all.Subscribe(e => { if (e.Id != 0xfffe) // 65534 { return; } byte format = e.ReadByte(); if (format != 1) throw new Exception("Unsuported manifest format found in EventSource event" + format); byte majorVersion = e.ReadByte(); byte minorVersion = e.ReadByte(); byte magic = e.ReadByte(); if (magic != 0x5b) throw new Exception("Unexpected content in EventSource event that was supposed to have manifest"); ushort totalChunks = e.ReadUInt16(); ushort chunkNumber = e.ReadUInt16(); string chunk = e.ReadAnsiString(); ManifestReassembly ra = null; if (!manifests.TryGetValue(e.ProviderId, out ra)) { ra = new ManifestReassembly { Totalchunks = totalChunks, LastChunkNumber = chunkNumber, Manifest = new StringBuilder(chunk) }; manifests.Add(e.ProviderId, ra); return; } if (chunkNumber <= ra.LastChunkNumber) return; else if (chunkNumber == ra.LastChunkNumber + 1) { ra.LastChunkNumber = chunkNumber; ra.Manifest.Append(chunk); } else throw new Exception("Missing chunks when trying to concatenate the manifest for provider " + e.ProviderId); }, () => evt.Set()); evt.WaitOne(); d.Dispose(); var result = new List<string>(); foreach (ManifestReassembly ra in manifests.Values) result.Add(ra.Manifest.ToString()); var r = result.ToArray(); return r; }
/// <summary> /// Extracts manifest from .etl file that was produced using System.Diagnostics.Tracing.EventSource /// </summary> /// <param name="etlFile">Trace file</param> /// <returns></returns> public static string[] ExtractManifests(string etlFile) { IObservable <EtwNativeEvent> all = FromFiles(etlFile); var manifests = new Dictionary <Guid, ManifestReassembly>(); var evt = new ManualResetEvent(false); IDisposable d = all.Subscribe(e => { if (e.Id != 0xfffe) // 65534 { return; } byte format = e.ReadByte(); if (format != 1) { throw new Exception("Unsuported manifest format found in EventSource event" + format); } byte majorVersion = e.ReadByte(); byte minorVersion = e.ReadByte(); byte magic = e.ReadByte(); if (magic != 0x5b) { throw new Exception("Unexpected content in EventSource event that was supposed to have manifest"); } ushort totalChunks = e.ReadUInt16(); ushort chunkNumber = e.ReadUInt16(); string chunk = e.ReadAnsiString(); ManifestReassembly ra = null; if (!manifests.TryGetValue(e.ProviderId, out ra)) { ra = new ManifestReassembly { Totalchunks = totalChunks, LastChunkNumber = chunkNumber, Manifest = new StringBuilder(chunk) }; manifests.Add(e.ProviderId, ra); return; } if (chunkNumber <= ra.LastChunkNumber) { return; } else if (chunkNumber == ra.LastChunkNumber + 1) { ra.LastChunkNumber = chunkNumber; ra.Manifest.Append(chunk); } else { throw new Exception("Missing chunks when trying to concatenate the manifest for provider " + e.ProviderId); } }, () => evt.Set()); evt.WaitOne(); d.Dispose(); var result = new List <string>(); foreach (ManifestReassembly ra in manifests.Values) { result.Add(ra.Manifest.ToString()); } var r = result.ToArray(); return(r); }