public static Address GetRawBinaryEntryAddress( RawFileDefinition rawFile, byte[] image, IProcessorArchitecture arch, Address baseAddr) { if (!string.IsNullOrEmpty(rawFile.EntryPoint.Address)) { if (arch.TryParseAddress(rawFile.EntryPoint.Address, out Address entryAddr)) { if (rawFile.EntryPoint.Follow) { var rdr = arch.CreateImageReader(new MemoryArea(baseAddr, image), entryAddr); var addr = arch.ReadCodeAddress(0, rdr, arch.CreateProcessorState()); return(addr); } else { return(entryAddr); } } else { return(baseAddr); } } return(baseAddr); }
private void Given_MsDosRawFileFormat() { this.x86arch = new Mock <IProcessorArchitecture>(); this.x86arch.Setup(a => a.Name).Returns("x86-real-16"); var env = new Mock <PlatformDefinition>(); this.msdosPlatform = new Mock <IPlatform>(); var map = new SegmentMap(Address.SegPtr(0x0C00, 0)); var state = new FakeProcessorState(x86arch.Object); var rawFile = new RawFileDefinition { BaseAddress = "0C00:0100", Environment = "ms-dos", Architecture = "x86-real-16", }; rawFile.EntryPoint.Address = null; rawFile.EntryPoint.Name = "Start_Here"; cfgSvc.Setup(d => d.GetRawFile("ms-dos-com")).Returns(rawFile); cfgSvc.Setup(d => d.GetArchitecture("x86-real-16")).Returns(x86arch.Object); cfgSvc.Setup(d => d.GetEnvironment("ms-dos")).Returns(env.Object); env.Setup(e => e.Load(It.IsAny <IServiceProvider>(), It.IsAny <IProcessorArchitecture>())) .Returns(msdosPlatform.Object); var addr = Address.SegPtr(0x0C00, 0x0100); x86arch.Setup(a => a.TryParseAddress( "0C00:0100", out addr)) .Returns(true); x86arch.Setup(a => a.CreateProcessorState()).Returns(state); }
private ImageLoader CreateRawImageLoader(string filename, byte[] image, RawFileDefinition rawFile) { var arch = cfgSvc.GetArchitecture(rawFile.Architecture); var env = cfgSvc.GetEnvironment(rawFile.Environment); IPlatform platform; if (env != null) { platform = env.Load(Services, arch); } else { platform = new DefaultPlatform(Services, arch); } Address entryAddr = null; if (arch.TryParseAddress(rawFile.BaseAddress, out Address baseAddr)) { entryAddr = GetRawBinaryEntryAddress(rawFile, image, arch, baseAddr); } var imgLoader = new NullImageLoader(Services, filename, image) { Architecture = arch, Platform = platform, PreferredBaseAddress = entryAddr, }; Address addrEp; if (rawFile.EntryPoint != null) { if (!string.IsNullOrEmpty(rawFile.EntryPoint.Address)) { arch.TryParseAddress(rawFile.EntryPoint.Address, out addrEp); } else { addrEp = baseAddr; } imgLoader.EntryPoints.Add(ImageSymbol.Procedure(arch, addrEp)); } return(imgLoader); }