1*a03ca8b9SKrzysztof Kosiński // Copyright 2017 The Chromium Authors. All rights reserved. 2*a03ca8b9SKrzysztof Kosiński // Use of this source code is governed by a BSD-style license that can be 3*a03ca8b9SKrzysztof Kosiński // found in the LICENSE file. 4*a03ca8b9SKrzysztof Kosiński 5*a03ca8b9SKrzysztof Kosiński #ifndef COMPONENTS_ZUCCHINI_TEST_DISASSEMBLER_H_ 6*a03ca8b9SKrzysztof Kosiński #define COMPONENTS_ZUCCHINI_TEST_DISASSEMBLER_H_ 7*a03ca8b9SKrzysztof Kosiński 8*a03ca8b9SKrzysztof Kosiński #include <memory> 9*a03ca8b9SKrzysztof Kosiński #include <string> 10*a03ca8b9SKrzysztof Kosiński #include <vector> 11*a03ca8b9SKrzysztof Kosiński 12*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/buffer_view.h" 13*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/disassembler.h" 14*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/image_utils.h" 15*a03ca8b9SKrzysztof Kosiński 16*a03ca8b9SKrzysztof Kosiński namespace zucchini { 17*a03ca8b9SKrzysztof Kosiński 18*a03ca8b9SKrzysztof Kosiński // A trivial Disassembler that reads injected references of 3 different types. 19*a03ca8b9SKrzysztof Kosiński // This is only meant for testing and is not a full implementation of a 20*a03ca8b9SKrzysztof Kosiński // disassembler. Reading reference ignores bounds, and writing references does 21*a03ca8b9SKrzysztof Kosiński // nothing. 22*a03ca8b9SKrzysztof Kosiński class TestDisassembler : public Disassembler { 23*a03ca8b9SKrzysztof Kosiński public: 24*a03ca8b9SKrzysztof Kosiński TestDisassembler(const ReferenceTypeTraits& traits1, 25*a03ca8b9SKrzysztof Kosiński const std::vector<Reference>& refs1, 26*a03ca8b9SKrzysztof Kosiński const ReferenceTypeTraits& traits2, 27*a03ca8b9SKrzysztof Kosiński const std::vector<Reference>& refs2, 28*a03ca8b9SKrzysztof Kosiński const ReferenceTypeTraits& traits3, 29*a03ca8b9SKrzysztof Kosiński const std::vector<Reference>& refs3); 30*a03ca8b9SKrzysztof Kosiński TestDisassembler(const TestDisassembler&) = delete; 31*a03ca8b9SKrzysztof Kosiński const TestDisassembler& operator=(const TestDisassembler&) = delete; 32*a03ca8b9SKrzysztof Kosiński ~TestDisassembler() override; 33*a03ca8b9SKrzysztof Kosiński 34*a03ca8b9SKrzysztof Kosiński // Disassembler: 35*a03ca8b9SKrzysztof Kosiński ExecutableType GetExeType() const override; 36*a03ca8b9SKrzysztof Kosiński std::string GetExeTypeString() const override; 37*a03ca8b9SKrzysztof Kosiński std::vector<ReferenceGroup> MakeReferenceGroups() const override; 38*a03ca8b9SKrzysztof Kosiński 39*a03ca8b9SKrzysztof Kosiński // Disassembler::ReaderFactory: MakeReadRefs1(offset_t,offset_t)40*a03ca8b9SKrzysztof Kosiński std::unique_ptr<ReferenceReader> MakeReadRefs1(offset_t /*lower*/, 41*a03ca8b9SKrzysztof Kosiński offset_t /*upper*/) { 42*a03ca8b9SKrzysztof Kosiński return MakeReadRefs(0); 43*a03ca8b9SKrzysztof Kosiński } MakeReadRefs2(offset_t,offset_t)44*a03ca8b9SKrzysztof Kosiński std::unique_ptr<ReferenceReader> MakeReadRefs2(offset_t /*lower*/, 45*a03ca8b9SKrzysztof Kosiński offset_t /*upper*/) { 46*a03ca8b9SKrzysztof Kosiński return MakeReadRefs(1); 47*a03ca8b9SKrzysztof Kosiński } MakeReadRefs3(offset_t,offset_t)48*a03ca8b9SKrzysztof Kosiński std::unique_ptr<ReferenceReader> MakeReadRefs3(offset_t /*lower*/, 49*a03ca8b9SKrzysztof Kosiński offset_t /*upper*/) { 50*a03ca8b9SKrzysztof Kosiński return MakeReadRefs(2); 51*a03ca8b9SKrzysztof Kosiński } 52*a03ca8b9SKrzysztof Kosiński 53*a03ca8b9SKrzysztof Kosiński // Disassembler::WriterFactory: MakeWriteRefs1(MutableBufferView image)54*a03ca8b9SKrzysztof Kosiński std::unique_ptr<ReferenceWriter> MakeWriteRefs1(MutableBufferView image) { 55*a03ca8b9SKrzysztof Kosiński return MakeWriteRefs(image); 56*a03ca8b9SKrzysztof Kosiński } MakeWriteRefs2(MutableBufferView image)57*a03ca8b9SKrzysztof Kosiński std::unique_ptr<ReferenceWriter> MakeWriteRefs2(MutableBufferView image) { 58*a03ca8b9SKrzysztof Kosiński return MakeWriteRefs(image); 59*a03ca8b9SKrzysztof Kosiński } MakeWriteRefs3(MutableBufferView image)60*a03ca8b9SKrzysztof Kosiński std::unique_ptr<ReferenceWriter> MakeWriteRefs3(MutableBufferView image) { 61*a03ca8b9SKrzysztof Kosiński return MakeWriteRefs(image); 62*a03ca8b9SKrzysztof Kosiński } 63*a03ca8b9SKrzysztof Kosiński 64*a03ca8b9SKrzysztof Kosiński private: 65*a03ca8b9SKrzysztof Kosiński // Disassembler: 66*a03ca8b9SKrzysztof Kosiński bool Parse(ConstBufferView image) override; 67*a03ca8b9SKrzysztof Kosiński 68*a03ca8b9SKrzysztof Kosiński std::unique_ptr<ReferenceReader> MakeReadRefs(int type); 69*a03ca8b9SKrzysztof Kosiński std::unique_ptr<ReferenceWriter> MakeWriteRefs(MutableBufferView image); 70*a03ca8b9SKrzysztof Kosiński 71*a03ca8b9SKrzysztof Kosiński ReferenceTypeTraits traits_[3]; 72*a03ca8b9SKrzysztof Kosiński std::vector<Reference> refs_[3]; 73*a03ca8b9SKrzysztof Kosiński }; 74*a03ca8b9SKrzysztof Kosiński 75*a03ca8b9SKrzysztof Kosiński } // namespace zucchini 76*a03ca8b9SKrzysztof Kosiński 77*a03ca8b9SKrzysztof Kosiński #endif // COMPONENTS_ZUCCHINI_TEST_DISASSEMBLER_H_ 78