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 Expression ReadSegmentedValue(DataType dt, Constant seg, Expression eOff) { var off = eOff as Constant; if (eOff != null) { var addr = arch.MakeSegmentedAddress(seg, off); if (!segmentMap.TryFindSegment(addr, out ImageSegment segment)) { return(Constant.Invalid); } var rdr = arch.CreateImageReader(segment.MemoryArea, addr); memAccesses[addr] = dt; if (dt == PrimitiveType.SegPtr32) { var addrRead = arch.ReadCodeAddress(dt.Size, rdr, null); if (addrRead != null) { return(addrRead); } else { //$REVIEW we want a warning here. OR the caller. return(Constant.Invalid); } } else { return(rdr.Read((PrimitiveType)dt)); } } throw new NotImplementedException(); }