コード例 #1
0
		public Devirtualizer(EazModule module, DevirtualizeOptions options, IList<Type> fixers, ILogger logger)
		{
			this.Parent = module;
			this.Options = options;
			this.Injector = new AttributeInjector(module);
			this.Fixers = (fixers != null ? fixers : new List<Type>());
			this.Logger = (logger != null ? logger : DummyLogger.NoThrowInstance);
		}
コード例 #2
0
 public Devirtualizer(EazModule module, DevirtualizeOptions options, IList <Type> fixers, ILogger logger)
 {
     this.Parent   = module;
     this.Options  = options;
     this.Injector = new AttributeInjector(module);
     this.Fixers   = (fixers != null ? fixers : new List <Type>());
     this.Logger   = (logger != null ? logger : DummyLogger.NoThrowInstance);
 }
コード例 #3
0
		public DevirtualizeResults Devirtualize(DevirtualizeOptions options, Action<DevirtualizeAttempt> attemptCallback)
		{
			var methods = this.Parent.FindMethodStubs();

			if (methods.Length == 0)
				return new DevirtualizeResults();

			var attempts = new List<DevirtualizeAttempt>();

			foreach (var method in methods)
			{
				var reader = new VirtualizedMethodBodyReader(method, this.Logger, this.Parent.Version);
				Exception exception = null, fixerException = null;

				try
				{
					reader.Read(); // Read method
				}
				catch (Exception e)
				{
					exception = e;
				}

				DevirtualizeAttempt attempt;

				if (exception == null)
				{
					var body = new CilBody(
						true,
						reader.Instructions,
						reader.ExceptionHandlers,
						reader.Locals
					);

					method.Method.FreeMethodBody();
					method.Method.Body = body;

					// Perform fixes
					try
					{
						PerformFixes(method.Method);
					}
					catch (Exception e)
					{
						fixerException = e;
					}

					if (fixerException == null)
					{
						// Inject DevirtualizedAttribute if specified
						if (options.HasFlag(DevirtualizeOptions.InjectAttributes))
							this.Injector.InjectDevirtualized(method.Method);

						attempt = new DevirtualizeAttempt(method, reader, body);
					}
					else
						attempt = new DevirtualizeAttempt(method, reader, fixerException);
				}
				else
					attempt = new DevirtualizeAttempt(method, reader, exception);

				// Add attempt to list and fire callback
				attempts.Add(attempt);
				if (attemptCallback != null)
					attemptCallback(attempt);
			}

			return new DevirtualizeResults(attempts);
		}
コード例 #4
0
		public DevirtualizeResults Devirtualize(DevirtualizeOptions options)
		{
			return this.Devirtualize(options, null);
		}
コード例 #5
0
		public Devirtualizer(EazModule module, DevirtualizeOptions options, ILogger logger)
			: this(module, options, null, logger)
		{
		}
コード例 #6
0
		public Devirtualizer(EazModule module, DevirtualizeOptions options)
			: this(module, options, null)
		{
		}
コード例 #7
0
 public DevirtualizeResults Devirtualize(DevirtualizeOptions options)
 {
     return(this.Devirtualize(options, null));
 }
コード例 #8
0
 public Devirtualizer(EazModule module, DevirtualizeOptions options, ILogger logger)
     : this(module, options, null, logger)
 {
 }
コード例 #9
0
 public Devirtualizer(EazModule module, DevirtualizeOptions options)
     : this(module, options, null)
 {
 }
コード例 #10
0
        public DevirtualizeResults Devirtualize(DevirtualizeOptions options, Action <DevirtualizeAttempt> attemptCallback)
        {
            var methods = this.Parent.FindMethodStubs();

            if (methods.Length == 0)
            {
                return(new DevirtualizeResults());
            }

            var attempts = new List <DevirtualizeAttempt>();

            foreach (var method in methods)
            {
                var       reader = new VirtualizedMethodBodyReader(method, this.Logger);
                Exception exception = null, fixerException = null;

                try
                {
                    reader.Read();                     // Read method
                }
                catch (Exception e)
                {
                    exception = e;
                }

                DevirtualizeAttempt attempt;

                if (exception == null)
                {
                    var body = new CilBody(
                        true,
                        reader.Instructions,
                        reader.ExceptionHandlers,
                        reader.Locals
                        );

                    method.Method.FreeMethodBody();
                    method.Method.Body = body;

                    // Perform fixes
                    try
                    {
                        PerformFixes(method.Method);
                    }
                    catch (Exception e)
                    {
                        fixerException = e;
                    }

                    if (fixerException == null)
                    {
                        // Inject DevirtualizedAttribute if specified
                        if (options.HasFlag(DevirtualizeOptions.InjectAttributes))
                        {
                            this.Injector.InjectDevirtualized(method.Method);
                        }

                        attempt = new DevirtualizeAttempt(method, reader, body);
                    }
                    else
                    {
                        attempt = new DevirtualizeAttempt(method, reader, fixerException);
                    }
                }
                else
                {
                    attempt = new DevirtualizeAttempt(method, reader, exception);
                }

                // Add attempt to list and fire callback
                attempts.Add(attempt);
                if (attemptCallback != null)
                {
                    attemptCallback(attempt);
                }
            }

            return(new DevirtualizeResults(attempts));
        }