Mono.Debugger.Backend.Inferior.WriteAddress C# (CSharp) Method

WriteAddress() public method

public WriteAddress ( TargetAddress address, TargetAddress value ) : void
address TargetAddress
value TargetAddress
return void
        public override void WriteAddress(TargetAddress address, TargetAddress value)
        {
            check_disposed ();
            switch (TargetAddressSize) {
            case 4:
                WriteInteger (address, (int) value.Address);
                break;

            case 8:
                WriteLongInteger (address, value.Address);
                break;

            default:
                throw new TargetMemoryException (
                    "Unknown target address size " + TargetAddressSize);
            }
        }

Usage Example

Example #1
0
        public override bool InterpretInstruction(Inferior inferior)
        {
            switch (InstructionType) {
            case Type.IndirectJump:
            case Type.Jump: {
                TargetAddress target = GetEffectiveAddress (inferior);
                Registers regs = inferior.GetRegisters ();
                regs [(int) X86_Register.RIP].SetValue (target);
                inferior.SetRegisters (regs);
                return true;
            }

            case Type.IndirectCall:
            case Type.Call: {
                TargetAddress target = GetEffectiveAddress (inferior);
                Registers regs = inferior.GetRegisters ();

                TargetAddress rip = new TargetAddress (
                    inferior.AddressDomain, regs [(int) X86_Register.RIP].Value);
                TargetAddress rsp = new TargetAddress (
                    inferior.AddressDomain, regs [(int) X86_Register.RSP].Value);

                inferior.WriteAddress (rsp - 8, rip + InstructionSize);

                regs [(int) X86_Register.RSP].SetValue (rsp - 8);
                regs [(int) X86_Register.RIP].SetValue (target);
                inferior.SetRegisters (regs);
                return true;
            }

            case Type.Ret: {
                Registers regs = inferior.GetRegisters ();

                TargetAddress rsp = new TargetAddress (
                    inferior.AddressDomain, regs [(int) X86_Register.RSP].Value);

                TargetAddress rip = inferior.ReadAddress (rsp);
                rsp += 8 + Displacement;

                regs [(int) X86_Register.RSP].SetValue (rsp);
                regs [(int) X86_Register.RIP].SetValue (rip);
                inferior.SetRegisters (regs);
                return true;
            }

            case Type.Interpretable: {
                Registers regs = inferior.GetRegisters ();

                TargetAddress rsp = new TargetAddress (
                    inferior.AddressDomain, regs [(int) X86_Register.RSP].Value);
                TargetAddress rbp = new TargetAddress (
                    inferior.AddressDomain, regs [(int) X86_Register.RBP].Value);
                TargetAddress rip = new TargetAddress (
                    inferior.AddressDomain, regs [(int) X86_Register.RIP].Value);

                if (Code [0] == 0x55) /* push %rbp */ {
                    inferior.WriteAddress (rsp - 8, rbp);
                    regs [(int) X86_Register.RSP].SetValue (rsp - 8);
                    regs [(int) X86_Register.RIP].SetValue (rip + 1);
                    inferior.SetRegisters (regs);
                    return true;
                }

                return false;
            }

            default:
                return false;
            }
        }
Inferior