public bool Run()
        {
            string manifestFile = opts.OutputManifest;

            var metadata = EventManifestParser.LoadWinmeta(diags);
            var reader   = new EventTemplateReader(diags, metadata);

            EventManifest         manifest;
            IEnumerable <Message> messages;

            if (opts.InputModule != null)
            {
                string providerBinary = Path.GetFullPath(opts.InputModule);

                using var module = SafeModuleHandle.LoadImageResource(providerBinary);
                if (module.IsInvalid)
                {
                    throw new Win32Exception();
                }

                using (var stream = module.OpenResource(UnsafeNativeMethods.RT_MESSAGETABLE, 1))
                    messages = reader.ReadMessageTable(stream);

                using (var stream = module.OpenResource("WEVT_TEMPLATE", 1))
                    manifest = reader.ReadWevtTemplate(stream, messages);

                foreach (var provider in manifest.Providers)
                {
                    provider.ResourceFileName = providerBinary;
                    provider.MessageFileName  = providerBinary;
                }
            }
            else
            {
                using (var stream = File.OpenRead(opts.InputMessageTable))
                    messages = reader.ReadMessageTable(stream);

                using (var stream = File.OpenRead(opts.InputEventTemplate))
                    manifest = reader.ReadWevtTemplate(stream, messages);
            }

            StripReservedMetadata(manifest, metadata);
            InferSymbols(manifest);
            StripDefaultMessageIds(manifest);

            XDocument doc      = manifest.ToXml();
            var       settings = new XmlWriterSettings {
                Indent      = true,
                IndentChars = "  "
            };

            using var output = File.Create(manifestFile);
            using var writer = XmlWriter.Create(output, settings);
            doc.WriteTo(writer);

            return(true);
        }
Example #2
0
        public static EventManifest LoadManifest(Stream input, string inputName)
        {
            var diagSink = new DiagnosticSink();
            var diags    = new DiagnosticsEngine(diagSink);

            var parser   = EventManifestParser.CreateWithWinmeta(diags);
            var manifest = parser.ParseManifest(input, inputName);

            diagSink.AssertNoErrors();

            MessageHelpers.AssignMessageIds(diags, manifest, () => new StableMessageIdGenerator(diags));

            diagSink.AssertNoErrors();
            return(manifest);
        }
        public int Execute()
        {
            bool hasManifests        = options.Inputs != null && options.Inputs.Count > 0;
            bool hasResOnlyManifests =
                options.ResourceGenOnlyInputs != null &&
                options.ResourceGenOnlyInputs.Count > 0;

            if (!hasManifests && !hasResOnlyManifests)
            {
                diags.ReportError("No input manifest specified.");
                Program.ShowBriefHelp();
                return(ExitCode.UserError);
            }

            if (hasManifests && options.Inputs.Count > 1)
            {
                diags.ReportError("Too many input manifests specified.");
                Program.ShowBriefHelp();
                return(ExitCode.UserError);
            }

            var parser = EventManifestParser.CreateWithWinmeta(
                diags, options.SchemaPath, options.WinmetaPath);

            var compilation = EventManifestCompilation.Create(diags, options);

            if (compilation == null)
            {
                return(ExitCode.Error);
            }

            var trap            = diags.TrapError();
            var manifests       = options.Inputs.Select(x => parser.ParseManifest(x)).ToList();
            var resGenManifests = options.ResourceGenOnlyInputs.Select(x => parser.ParseManifest(x)).ToList();

            if (trap.ErrorOccurred)
            {
                return(ExitCode.Error);
            }

            if (!compilation.AddManifests(manifests) ||
                !compilation.AddResourceGenManifests(resGenManifests))
            {
                return(ExitCode.Error);
            }

            return(compilation.Emit() ? ExitCode.Success : ExitCode.Error);
        }
Example #4
0
        public SolutionTraceSettingsContext(ISolutionBrowser solutionBrowser = null)
        {
            this.solutionBrowser = solutionBrowser;

            ProjectsInSolution  = FindProjects();
            ManifestsInSolution = ThreadingExtensions.CreateAsyncLazy(FindManifests);

            manifestCache = new FileLruCache <EventManifest>(
                10, path => {
                var diags = new DiagnosticCollector();

                var parser   = EventManifestParser.CreateWithWinmeta(diags);
                var manifest = parser.ParseManifest(path);
                if (manifest == null || diags.Diagnostics.Count != 0)
                {
                    throw new Exception(
                        string.Join("\r\n", diags.Diagnostics.Select(x => x.Message)));
                }

                return(manifest);
            });
        }
Example #5
0
 protected ValidationTest()
 {
     diags  = new DiagnosticsCollector();
     parser = EventManifestParser.CreateWithWinmeta(diags);
 }