예제 #1
0
        /// <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);
        }