Example #1
0
 public NodeDecompiler(Func<Func<object>, object> execInThread, ITextOutput output, ILanguage language, DecompilationContext decompilationContext, IDecompileNodeContext decompileNodeContext = null)
 {
     this.execInThread = execInThread;
     this.output = output;
     this.language = language;
     this.decompilationContext = decompilationContext;
     this.decompileNodeContext = decompileNodeContext;
 }
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="type">Type</param>
		/// <param name="output">Output</param>
		/// <param name="ctx">Context</param>
		public DecompilePartialType(TypeDef type, ITextOutput output, DecompilationContext ctx)
			: base(output, ctx) {
			if (type == null)
				throw new ArgumentNullException();
			this.Type = type;
			this.AddPartialKeyword = true;
			this.UseUsingDeclarations = true;
			this.definitions = new HashSet<IMemberDef>();
			this.interfacesToRemove = new List<ITypeDefOrRef>();
		}
		public ProjectModuleOptions(ModuleDef module, ILanguage language, DecompilationContext decompilationContext) {
			if (language == null || decompilationContext == null || module == null)
				throw new ArgumentNullException();
			this.Module = module;
			this.Language = language;
			this.DecompilationContext = decompilationContext;
			this.ProjectGuid = Guid.NewGuid();
			this.UnpackResources = true;
			this.CreateResX = true;
			this.DecompileXaml = true;
		}
Example #4
0
		public virtual void DecompileNamespace(string @namespace, IEnumerable<TypeDef> types, ITextOutput output, DecompilationContext ctx) {
			this.WriteCommentLine(output, string.IsNullOrEmpty(@namespace) ? string.Empty : IdentifierEscaper.Escape(@namespace));
			this.WriteCommentLine(output, string.Empty);
			this.WriteCommentLine(output, Languages_Resources.Decompile_Namespace_Types);
			this.WriteCommentLine(output, string.Empty);
			foreach (var type in types) {
				this.WriteCommentBegin(output, true);
				output.WriteReference(IdentifierEscaper.Escape(type.Name), type, TextTokenKind.Comment);
				this.WriteCommentEnd(output, true);
				output.WriteLine();
			}
		}
Example #5
0
		public virtual void Decompile(MethodDef method, ITextOutput output, DecompilationContext ctx) {
			this.WriteCommentLine(output, TypeToString(method.DeclaringType, true) + "." + method.Name);
		}
Example #6
0
		void DecompileInternal(ModuleDef mod, ITextOutput output, DecompilationContext ctx) {
			this.WriteCommentLine(output, mod.Location);
			this.WriteCommentLine(output, mod.Name);
		}
Example #7
0
 ReflectionDisassembler CreateReflectionDisassembler(ITextOutput output, DecompilationContext ctx, IMemberDef member)
 {
     return CreateReflectionDisassembler(output, ctx, member.Module);
 }
Example #8
0
		public override void Decompile(MethodDef method, ITextOutput output, DecompilationContext ctx) {
			WriteCommentLineDeclaringType(output, method);
			var state = CreateAstBuilder(ctx, langSettings.Settings, currentType: method.DeclaringType, isSingleMember: true);
			try {
				if (method.IsConstructor && !method.IsStatic && !method.DeclaringType.IsValueType) {
					// also fields and other ctors so that the field initializers can be shown as such
					AddFieldsAndCtors(state.AstBuilder, method.DeclaringType, method.IsStatic);
					RunTransformsAndGenerateCode(ref state, output, ctx, new SelectCtorTransform(method));
				}
				else {
					state.AstBuilder.AddMethod(method);
					RunTransformsAndGenerateCode(ref state, output, ctx);
				}
			}
			finally {
				state.Dispose();
			}
		}
Example #9
0
 public BuilderState(DecompilationContext ctx, BuilderCache cache)
 {
     this.ctx = ctx;
     this.cache = cache;
     this.State = cache.AllocateAstBuilderState();
 }
Example #10
0
		BuilderState CreateAstBuilder(DecompilationContext ctx, DecompilerSettings settings, ModuleDef currentModule = null, TypeDef currentType = null, bool isSingleMember = false) {
			if (currentModule == null)
				currentModule = currentType.Module;
			if (isSingleMember) {
				settings = settings.Clone();
				settings.UsingDeclarations = false;
			}
			var cache = ctx.GetOrCreate<BuilderCache>();
			var state = new BuilderState(ctx, cache);
			state.AstBuilder.Context.CurrentModule = currentModule;
			state.AstBuilder.Context.CancellationToken = ctx.CancellationToken;
			state.AstBuilder.Context.CurrentType = currentType;
			state.AstBuilder.Context.Settings = settings;
			return state;
		}
Example #11
0
		public virtual void Decompile(EventDef ev, ITextOutput output, DecompilationContext ctx) {
			this.WriteCommentLine(output, TypeToString(ev.DeclaringType, true) + "." + ev.Name);
		}
Example #12
0
		void RunTransformsAndGenerateCode(ref BuilderState state, ITextOutput output, DecompilationContext ctx, IAstTransform additionalTransform = null) {
			var astBuilder = state.AstBuilder;
			astBuilder.RunTransformations(transformAbortCondition);
			if (additionalTransform != null) {
				additionalTransform.Run(astBuilder.SyntaxTree);
			}
			AddXmlDocumentation(ref state, langSettings.Settings, astBuilder);
			astBuilder.GenerateCode(output);
		}
Example #13
0
		public override void Decompile(ModuleDef mod, ITextOutput output, DecompilationContext ctx) {
			WriteModule(mod, output, ctx);

			using (ctx.DisableAssemblyLoad()) {
				var state = CreateAstBuilder(ctx, langSettings.Settings, currentModule: mod);
				try {
					state.AstBuilder.AddAssembly(mod, true, false, true);
					RunTransformsAndGenerateCode(ref state, output, ctx);
				}
				finally {
					state.Dispose();
				}
			}
		}
Example #14
0
		public override void Decompile(TypeDef type, ITextOutput output, DecompilationContext ctx) {
			var state = CreateAstBuilder(ctx, langSettings.Settings, currentType: type);
			try {
				state.AstBuilder.AddType(type);
				RunTransformsAndGenerateCode(ref state, output, ctx);
			}
			finally {
				state.Dispose();
			}
		}
Example #15
0
		public override void Decompile(EventDef ev, ITextOutput output, DecompilationContext ctx) {
			WriteCommentLineDeclaringType(output, ev);
			var state = CreateAstBuilder(ctx, langSettings.Settings, currentType: ev.DeclaringType, isSingleMember: true);
			try {
				state.AstBuilder.AddEvent(ev);
				RunTransformsAndGenerateCode(ref state, output, ctx);
			}
			finally {
				state.Dispose();
			}
		}
Example #16
0
		public override void Decompile(FieldDef field, ITextOutput output, DecompilationContext ctx) {
			WriteCommentLineDeclaringType(output, field);
			var state = CreateAstBuilder(ctx, langSettings.Settings, currentType: field.DeclaringType, isSingleMember: true);
			try {
				if (field.IsLiteral) {
					state.AstBuilder.AddField(field);
				}
				else {
					// also decompile ctors so that the field initializer can be shown
					AddFieldsAndCtors(state.AstBuilder, field.DeclaringType, field.IsStatic);
				}
				RunTransformsAndGenerateCode(ref state, output, ctx, new SelectFieldTransform(field));
			}
			finally {
				state.Dispose();
			}
		}
Example #17
0
		public virtual void Decompile(PropertyDef property, ITextOutput output, DecompilationContext ctx) {
			this.WriteCommentLine(output, TypeToString(property.DeclaringType, true) + "." + property.Name);
		}
Example #18
0
		public WinFormsProjectFile(TypeDef type, string filename, DecompilationContext decompilationContext, ILanguage language)
			: base(type, filename, decompilationContext, language) {
			this.SubType = "Form";
		}
Example #19
0
		public virtual void Decompile(FieldDef field, ITextOutput output, DecompilationContext ctx) {
			this.WriteCommentLine(output, TypeToString(field.DeclaringType, true) + "." + field.Name);
		}
Example #20
0
		protected void WriteModule(ModuleDef mod, ITextOutput output, DecompilationContext ctx) {
			DecompileInternal(mod, output, ctx);
			output.WriteLine();
			if (mod.Types.Count > 0) {
				this.WriteCommentBegin(output, true);
				output.Write(Languages_Resources.Decompile_GlobalType + " ", TextTokenKind.Comment);
				output.WriteReference(IdentifierEscaper.Escape(mod.GlobalType.FullName), mod.GlobalType, TextTokenKind.Comment);
				output.WriteLine();
			}
			this.PrintEntryPoint(mod, output);
			this.WriteCommentLine(output, Languages_Resources.Decompile_Architecture + " " + GetPlatformDisplayName(mod));
			if (!mod.IsILOnly) {
				this.WriteCommentLine(output, Languages_Resources.Decompile_ThisAssemblyContainsUnmanagedCode);
			}
			string runtimeName = GetRuntimeDisplayName(mod);
			if (runtimeName != null) {
				this.WriteCommentLine(output, Languages_Resources.Decompile_Runtime + " " + runtimeName);
			}
			var peImage = TryGetPEImage(mod);
			if (peImage != null) {
				this.WriteCommentBegin(output, true);
				uint ts = peImage.ImageNTHeaders.FileHeader.TimeDateStamp;
				var date = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(ts);
				var dateString = date.ToString(CultureInfo.CurrentUICulture.DateTimeFormat);
				output.Write(string.Format(Languages_Resources.Decompile_Timestamp, ts, dateString), TextTokenKind.Comment);
				this.WriteCommentEnd(output, true);
				output.WriteLine();
			}
			output.WriteLine();
		}
Example #21
0
		public virtual void Decompile(TypeDef type, ITextOutput output, DecompilationContext ctx) {
			this.WriteCommentLine(output, TypeToString(type, true));
		}
		public AssemblyInfoProjectFile(ModuleDef module, string filename, DecompilationContext decompilationContext, ILanguage language) {
			this.module = module;
			this.filename = filename;
			this.decompilationContext = decompilationContext;
			this.language = language;
		}
Example #23
0
		protected void WriteAssembly(AssemblyDef asm, ITextOutput output, DecompilationContext ctx) {
			DecompileInternal(asm, output, ctx);
			output.WriteLine();
			this.PrintEntryPoint(asm.ManifestModule, output);
			var peImage = TryGetPEImage(asm.ManifestModule);
			if (peImage != null) {
				this.WriteCommentBegin(output, true);
				uint ts = peImage.ImageNTHeaders.FileHeader.TimeDateStamp;
				var date = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(ts);
				var dateString = date.ToString(CultureInfo.CurrentUICulture.DateTimeFormat);
				output.Write(string.Format(Languages_Resources.Decompile_Timestamp, ts, dateString), TextTokenKind.Comment);
				this.WriteCommentEnd(output, true);
				output.WriteLine();
			}
			output.WriteLine();
		}
Example #24
0
 ReflectionDisassembler CreateReflectionDisassembler(ITextOutput output, DecompilationContext ctx, ModuleDef ownerModule)
 {
     var disOpts = new DisassemblerOptions(ctx.CancellationToken, ownerModule);
     if (langSettings.Settings.ShowILComments)
         disOpts.GetOpCodeDocumentation = ILLanguageHelper.GetOpCodeDocumentation;
     if (langSettings.Settings.ShowXmlDocumentation)
         disOpts.GetXmlDocComments = GetXmlDocComments;
     disOpts.CreateInstructionBytesReader = m => InstructionBytesReader.Create(m, ctx.IsBodyModified != null && ctx.IsBodyModified(m));
     disOpts.ShowTokenAndRvaComments = langSettings.Settings.ShowTokenAndRvaComments;
     disOpts.ShowILBytes = langSettings.Settings.ShowILBytes;
     disOpts.SortMembers = langSettings.Settings.SortMembers;
     return new ReflectionDisassembler(output, detectControlStructure, disOpts);
 }
Example #25
0
		public virtual void Decompile(AssemblyDef asm, ITextOutput output, DecompilationContext ctx) {
			DecompileInternal(asm, output, ctx);
		}
Example #26
0
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="module">Type</param>
		/// <param name="output">Output</param>
		/// <param name="ctx">Context</param>
		public DecompileAssemblyInfo(ModuleDef module, ITextOutput output, DecompilationContext ctx)
			: base(output, ctx) {
			if (module == null)
				throw new ArgumentNullException();
			this.Module = module;
		}
Example #27
0
            public void Execute(ExportToProjectVM vm)
            {
                vm.ProgressMinimum = 0;
                vm.ProgressMaximum = 1;
                vm.TotalProgress = 0;
                vm.IsIndeterminate = false;
                Task.Factory.StartNew(() => {
                    AppCulture.InitializeCulture();
                    var decompilationContext = new DecompilationContext {
                        CancellationToken = cancellationTokenSource.Token,
                        GetDisableAssemblyLoad = () => owner.fileTreeView.FileManager.DisableAssemblyLoad(),
                    };
                    var options = new ProjectCreatorOptions(vm.Directory, cancellationTokenSource.Token);
                    options.ProjectVersion = vm.ProjectVersion;
                    if (vm.CreateSolution)
                        options.SolutionFilename = vm.SolutionFilename;
                    options.Logger = this;
                    options.ProgressListener = this;

                    bool hasProjectGuid = vm.ProjectGuid.Value != null;
                    string guidFormat = null;
                    int guidNum = 0;
                    if (hasProjectGuid) {
                        string guidStr = vm.ProjectGuid.Value.ToString();
                        guidNum = int.Parse(guidStr.Substring(36 - 8, 8), NumberStyles.HexNumber);
                        guidFormat = guidStr.Substring(0, 36 - 8) + "{0:X8}";
                    }
                    foreach (var module in modules.OrderBy(a => a.Location, StringComparer.InvariantCultureIgnoreCase)) {
                        var projOpts = new ProjectModuleOptions(module, vm.Language, decompilationContext) {
                            DontReferenceStdLib = vm.DontReferenceStdLib,
                            UnpackResources = vm.UnpackResources,
                            CreateResX = vm.CreateResX,
                            DecompileXaml = vm.DecompileXaml,
                            ProjectGuid = hasProjectGuid ? new Guid(string.Format(guidFormat, guidNum++)) : Guid.NewGuid(),
                        };
                        if (bamlDecompiler != null) {
                            var o = BamlDecompilerOptions.Create(vm.Language);
                            projOpts.DecompileBaml = (a, b, c, d) => bamlDecompiler.Decompile(a, b, c, o, d);
                        }
                        options.ProjectModules.Add(projOpts);
                    }
                    var creator = new MSBuildProjectCreator(options);

                    creator.Create();
                    if (vm.CreateSolution)
                        fileToOpen = creator.SolutionFilename;
                    else
                        fileToOpen = creator.ProjectFilenames.FirstOrDefault();
                }, cancellationTokenSource.Token)
                .ContinueWith(t => {
                    var ex = t.Exception;
                    if (ex != null)
                        Error(string.Format(dnSpy_Resources.ErrorExceptionOccurred, ex));
                    EmtpyErrorList();
                    vm.OnExportComplete();
                    if (!vm.ExportErrors) {
                        dlg.Close();
                        if (vm.OpenProject)
                            OpenProject();
                    }
                }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
            }
Example #28
0
		public virtual void Decompile(ModuleDef mod, ITextOutput output, DecompilationContext ctx) {
			DecompileInternal(mod, output, ctx);
		}
Example #29
0
		public TypeProjectFile(TypeDef type, string filename, DecompilationContext decompilationContext, ILanguage language) {
			this.type = type;
			this.filename = filename;
			this.decompilationContext = decompilationContext;
			this.language = language;
		}
Example #30
0
		void DecompileInternal(AssemblyDef asm, ITextOutput output, DecompilationContext ctx) {
			this.WriteCommentLine(output, asm.ManifestModule.Location);
			if (asm.IsContentTypeWindowsRuntime)
				this.WriteCommentLine(output, asm.Name + " [WinRT]");
			else
				this.WriteCommentLine(output, asm.FullName);
		}