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); }
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); }
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); }); }
protected ValidationTest() { diags = new DiagnosticsCollector(); parser = EventManifestParser.CreateWithWinmeta(diags); }