예제 #1
0
        public virtual void Disassemble(PEFile module, MethodDefinitionHandle handle)
        {
            this.module      = module ?? throw new ArgumentNullException(nameof(module));
            metadata         = module.Metadata;
            genericContext   = new GenericContext(handle, module);
            signatureDecoder = new DisassemblerSignatureProvider(module, output);
            var methodDefinition = metadata.GetMethodDefinition(handle);

            // start writing IL code
            output.WriteLine("// Method begins at RVA 0x{0:x4}", methodDefinition.RelativeVirtualAddress);
            if (methodDefinition.RelativeVirtualAddress == 0)
            {
                output.WriteLine("// Code size {0} (0x{0:x})", 0);
                output.WriteLine(".maxstack {0}", 0);
                output.WriteLine();
                return;
            }
            MethodBodyBlock body;

            try {
                body = module.Reader.GetMethodBody(methodDefinition.RelativeVirtualAddress);
            } catch (BadImageFormatException ex) {
                output.WriteLine("// {0}", ex.Message);
                return;
            }
            var blob = body.GetILReader();

            output.WriteLine("// Code size {0} (0x{0:x})", blob.Length);
            output.WriteLine(".maxstack {0}", body.MaxStack);

            var entrypointHandle = MetadataTokens.MethodDefinitionHandle(module.Reader.PEHeaders.CorHeader.EntryPointTokenOrRelativeVirtualAddress);

            if (handle == entrypointHandle)
            {
                output.WriteLine(".entrypoint");
            }

            DisassembleLocalsBlock(body);
            output.WriteLine();

            sequencePoints         = DebugInfo?.GetSequencePoints(handle) ?? EmptyList <DebugInfo.SequencePoint> .Instance;
            nextSequencePointIndex = 0;
            if (DetectControlStructure && blob.Length > 0)
            {
                blob.Reset();
                HashSet <int> branchTargets = GetBranchTargets(blob);
                blob.Reset();
                WriteStructureBody(new ILStructure(module, handle, genericContext, body), branchTargets, ref blob);
            }
            else
            {
                while (blob.RemainingBytes > 0)
                {
                    WriteInstruction(output, metadata, handle, ref blob);
                }
                WriteExceptionHandlers(module, handle, body);
            }
            sequencePoints = null;
        }
예제 #2
0
        internal void WriteExceptionHandlers(PEFile module, MethodDefinitionHandle handle, MethodBodyBlock body)
        {
            this.module      = module;
            metadata         = module.Metadata;
            genericContext   = new GenericContext(handle, module);
            signatureDecoder = new DisassemblerSignatureProvider(module, output);
            var handlers = body.ExceptionRegions;

            if (!handlers.IsEmpty)
            {
                output.WriteLine();
                foreach (var eh in handlers)
                {
                    eh.WriteTo(module, genericContext, output);
                    output.WriteLine();
                }
            }
        }