public void Cmasp_Do()
        {
            var addr = Address.SegPtr(0x0C20, 0);
            var proc = new Procedure("foo", null);
            var progaddr = new ProgramAddress(program, addr);
            var dc = mr.Stub<IDecompiler>();
            var dcSvc = mr.Stub<IDecompilerService>();
            var brSvc = mr.Stub<IProjectBrowserService>();
            dcSvc.Decompiler = dc;
            sc.AddService<IDecompilerService>(dcSvc);
            sc.AddService<IProjectBrowserService>(brSvc);
            sc.AddService<IDecompilerShellUiService>(new FakeShellUiService());
            dc.Expect(d => d.ScanProcedure(progaddr)).IgnoreArguments().Return(proc);
            brSvc.Expect(b => b.Reload());
            mr.ReplayAll();

            var locations = new[] { new ProgramAddress(program, addr) };
            var cmd = new Cmd_MarkProcedures(sc, locations);
            cmd.DoIt();

            mr.VerifyAll();
            Assert.AreEqual(1, program.User.Procedures.Count);
            var uproc = program.User.Procedures.Values[0];
            Assert.AreEqual("0C20:0000", uproc.Address);
        }
 public string RenderData(ProgramAddress hit)
 {
     var rdr = hit.Program.CreateImageReader(hit.Address);
     var sb = new StringBuilder();
     int cb = 0;
     while (rdr.IsValid)
     {
         var ch = rdr.ReadByte();
         if (ch == 0 || cb >= 16)
             break;
         sb.AppendFormat("{0:X2} ", (uint)ch);
         ++cb;
     }
     return sb.ToString();
 }
 public string RenderString(ProgramAddress hit)
 {
     var rdr = hit.Program.CreateImageReader(hit.Address);
     var sb = new StringBuilder();
     while (rdr.IsValid)
     {
         var ch = rdr.ReadByte();
         if (ch == 0 || sb.Length > 80)
             break;
         sb.Append(0x20 <= ch && ch < 0x7F
             ? (char)ch
             : '.');
     }
     return sb.ToString();
 }
 public string RenderCode(ProgramAddress hit)
 {
     try
     {
         var dasm = hit.Program.CreateDisassembler(hit.Address);
         return string.Join("; ", dasm.Take(4).Select(inst => inst.ToString().Replace('\t', ' ')));
     }
     catch
     {
         return "<invalid>";
     }
 }
Example #5
0
 /// <summary>
 /// Starts a scan at address <paramref name="addr"/> on the user's request.
 /// </summary>
 /// <param name="addr"></param>
 /// <returns>a ProcedureBase, because the target procedure may have been a thunk or 
 /// an linked procedure the user has decreed not decompileable.</returns>
 public ProcedureBase ScanProcedure(ProgramAddress paddr)
 {
     if (scanner == null)        //$TODO: it's unfortunate that we depend on the scanner of the Decompiler class.
         scanner = CreateScanner(paddr.Program);
     return scanner.ScanProcedure(paddr.Address, null, paddr.Program.Architecture.CreateProcessorState());
 }
Example #6
0
 public ICommand MarkProcedure(ProgramAddress address)
 {
     return new Cmd_MarkProcedures(services, new ProgramAddress[] { address });
 }
Example #7
0
 /// <summary>
 /// Starts a scan at address <paramref name="addr"/> on the user's request.
 /// </summary>
 /// <param name="addr"></param>
 /// <returns>a ProcedureBase, because the target procedure may have been a thunk or 
 /// an linked procedure the user has decreed not decompileable.</returns>
 public ProcedureBase ScanProcedure(ProgramAddress paddr)
 {
     if (scanner == null)        //$TODO: it's unfortunate that we depend on the scanner of the Decompiler class.
         scanner = CreateScanner(paddr.Program);
     Procedure_v1 sProc;
     var procName = paddr.Program.User.Procedures.TryGetValue(
         paddr.Address, out sProc) ? sProc.Name : null;
     return scanner.ScanProcedure(paddr.Address, procName, paddr.Program.Architecture.CreateProcessorState());
 }
Example #8
0
 public void MarkAndScanProcedure()
 {
     AddressRange addrRange;
     if (!TryGetSelectedAddressRange(out addrRange))
         return;
     var address = new ProgramAddress(program, addrRange.Begin);
     services.RequireService<ICommandFactory>().MarkProcedure(address).Do();
 }
        private void ModifyDeclaration()
        {
            var declText = declarationForm.TextBox.Text.Trim();
            Procedure proc;
            if (!program.Procedures.TryGetValue(address, out proc))
                proc = null;
            ProcedureBase_v1 sProc;
            GlobalDataItem_v2 parsedGlobal;
            string procName = null;
            string CSignature = null;
            if (TryParseSignature(declText, out sProc))
            {
                procName = sProc.Name;
                CSignature = declText;
            }
            else if (UserSignatureBuilder.IsValidCIdentifier(declText) &&
                    (proc == null || proc.Name != declText))
            {
                procName = declText;
            }
            else if (!editProcedure && TryParseGlobal(declText, out parsedGlobal))
            {
                program.User.Procedures.Remove(address);
                program.ModifyUserGlobal(
                    address, parsedGlobal.DataType, parsedGlobal.Name
                );
            }

            if (procName != null)
            {
                program.RemoveUserGlobal(address);
                var up = program.EnsureUserProcedure(address, procName);
                if (CSignature != null)
                    up.CSignature = CSignature;
                if (proc != null)
                    proc.Name = procName;
                else
                {
                    var pAddr = new ProgramAddress(program, address);
                    services.RequireService<ICommandFactory>().MarkProcedure(pAddr).Do();
                }
            }
        }