1 #include "loader.h"
2
3 namespace REDasm {
4
LOADER_PLUGIN_TEST(LoaderPluginB,u8)5 LOADER_PLUGIN_TEST(LoaderPluginB, u8)
6 {
7 RE_UNUSED(request);
8 RE_UNUSED(header);
9 return true;
10 }
11
LoaderPlugin(AbstractBuffer * buffer)12 LoaderPlugin::LoaderPlugin(AbstractBuffer* buffer): Plugin()
13 {
14 m_buffer = std::unique_ptr<AbstractBuffer>(buffer); // Take ownership
15 m_view = m_buffer->view(0); // Full View
16 }
17
createDocument()18 ListingDocument& LoaderPlugin::createDocument() { m_document = ListingDocument(); return m_document; }
document() const19 const ListingDocument &LoaderPlugin::document() const { return m_document; }
document()20 ListingDocument& LoaderPlugin::document() { return m_document; }
signatures()21 SignatureIdentifiers &LoaderPlugin::signatures() { return m_signatures; }
22
offset(address_t address) const23 offset_location LoaderPlugin::offset(address_t address) const
24 {
25 for(const Segment& segment : m_document->segments())
26 {
27 if(!segment.contains(address))
28 continue;
29
30 offset_t offset = (address - segment.address) + segment.offset;
31 return REDasm::make_location(offset, segment.containsOffset(offset));
32 }
33
34 return REDasm::invalid_location<offset_t>();
35 }
36
address(offset_t offset) const37 address_location LoaderPlugin::address(offset_t offset) const
38 {
39 for(const Segment& segment : m_document->segments())
40 {
41 if(!segment.containsOffset(offset))
42 continue;
43
44 address_t address = (offset - segment.offset) + segment.address;
45 return REDasm::make_location(address, segment.contains(address));
46 }
47
48 return REDasm::invalid_location<address_t>();
49 }
50
build(const std::string & assembler,offset_t offset,address_t baseaddress,address_t entrypoint)51 void LoaderPlugin::build(const std::string &assembler, offset_t offset, address_t baseaddress, address_t entrypoint) { throw std::runtime_error("Invalid call to LoaderPlugin::build()"); }
createAnalyzer(DisassemblerAPI * disassembler) const52 Analyzer* LoaderPlugin::createAnalyzer(DisassemblerAPI *disassembler) const { return new Analyzer(disassembler); }
assembler() const53 std::string LoaderPlugin::assembler() const { return std::string(); }
buffer() const54 AbstractBuffer *LoaderPlugin::buffer() const { return m_buffer.get(); }
viewOffset(offset_t offset) const55 BufferView LoaderPlugin::viewOffset(offset_t offset) const { return m_buffer->view(offset); }
56
view(address_t address) const57 BufferView LoaderPlugin::view(address_t address) const
58 {
59 offset_location offset = this->offset(address);
60
61 if(!offset.valid)
62 return BufferView();
63
64 return this->viewOffset(offset);
65 }
66
viewSegment(const Segment * segment) const67 BufferView LoaderPlugin::viewSegment(const Segment *segment) const
68 {
69 if(!segment || segment->empty() || segment->is(SegmentType::Bss))
70 return BufferView();
71
72 return m_buffer->view(segment->offset, segment->rawSize());
73 }
74
75 } // namespace REDasm
76