public void BwiX86_RewriteIndirectCall() { BuildTest16(m => { m.Call(m.MemW(Registers.cs, Registers.bx, 4)); }); var uc = new UserCallData { Address = Address.SegPtr(0xC00, 0), Signature = new FunctionType( Reg(Registers.ax), new Identifier[] { Reg(Registers.cx) }) }; program.User.Calls.Add(uc.Address, uc); wi.Process(); var sw = new StringWriter(); block.WriteStatements(sw); string sExp = "\tax = SEQ(0x0C00, Mem0[ds:bx + 0x0004:word16])(cx)" + nl; Assert.AreEqual(sExp, sw.ToString()); }
public ICallSiteDialog CreateCallSiteDialog(Program program, UserCallData ucd) { Debug.Assert(ucd != null && ucd.Address != null); var dlg = new CallSiteDialog(); dlg.Address = ucd.Address; dlg.NoReturn.Checked = ucd.NoReturn; return(dlg); }
private UserCallData GetUserCallDataFromAddress(Address addr) { if (!program.User.Calls.TryGetValue(addr, out UserCallData ucd)) { ucd = new UserCallData { Address = addr }; } return(ucd); }
private FunctionType GetCallSignatureAtAddress(Address addrCallInstruction) { UserCallData call = null; if (!program.User.Calls.TryGetValue(addrCallInstruction, out call)) { return(null); } return(call.Signature); }
private bool OnAfterCall(FunctionType sigCallee, ProcedureCharacteristics characteristics) { UserCallData userCall = null; if (program.User.Calls.TryGetUpperBound(ric.Address, out userCall)) { var linStart = ric.Address.ToLinear(); var linEnd = linStart + ric.Length; var linUserCall = userCall.Address.ToLinear(); if (linStart > linUserCall || linUserCall >= linEnd) { userCall = null; } } if ((characteristics != null && characteristics.Terminates) || (userCall != null && userCall.NoReturn)) { scanner.TerminateBlock(blockCur, ric.Address + ric.Length); return(false); } if (sigCallee != null) { if (sigCallee.StackDelta != 0) { Expression newVal = new BinaryExpression( Operator.IAdd, stackReg.DataType, stackReg, Constant.Create( PrimitiveType.CreateWord(stackReg.DataType.Size), sigCallee.StackDelta)); newVal = newVal.Accept(eval); SetValue(stackReg, newVal); } } state.OnAfterCall(sigCallee); // Adjust stack after call if (sigCallee != null) { int delta = sigCallee.StackDelta - sigCallee.ReturnAddressOnStack; if (delta != 0) { var d = Constant.Create(stackReg.DataType, delta); this.Emit(new Assignment( stackReg, new BinaryExpression(Operator.IAdd, stackReg.DataType, stackReg, d))); } } return(true); }
private SerializedCall_v1 SerializeUserCall(Program program, UserCallData uc) { if (uc == null || uc.Address == null) { return(null); } var procser = program.CreateProcedureSerializer(); SerializedSignature ssig = null; if (uc.Signature != null) { ssig = procser.Serialize(uc.Signature); } return(new SerializedCall_v1 { InstructionAddress = uc.Address.ToString(), Comment = uc.Comment, NoReturn = uc.NoReturn, Signature = ssig, }); }
private void SetUserCallData(UserCallData ucd) { program.User.Calls[ucd.Address] = ucd; }
private SerializedCall_v1 SerializeUserCall(Program program, UserCallData uc) { if (uc == null || uc.Address == null) return null; var procser = program.CreateProcedureSerializer(); SerializedSignature ssig = null; if (uc.Signature != null) { ssig = procser.Serialize(uc.Signature); } return new SerializedCall_v1 { InstructionAddress = uc.Address.ToString(), Comment = uc.Comment, NoReturn = uc.NoReturn, Signature = ssig, }; }