blob: febedc50e408b99604d6ecf225bf47a4d8eaf880 [file] [log] [blame]
Samuel Huang06f1ae92018-03-13 18:19:34 +00001// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef COMPONENTS_ZUCCHINI_ELEMENT_DETECTION_H_
6#define COMPONENTS_ZUCCHINI_ELEMENT_DETECTION_H_
7
8#include <stddef.h>
9
10#include <memory>
11
12#include "base/callback.h"
Samuel Huang06f1ae92018-03-13 18:19:34 +000013#include "components/zucchini/buffer_view.h"
14#include "components/zucchini/image_utils.h"
Anton Bikineev1a965512021-05-15 22:35:36 +000015#include "third_party/abseil-cpp/absl/types/optional.h"
Samuel Huang06f1ae92018-03-13 18:19:34 +000016
17namespace zucchini {
18
19class Disassembler;
20
21// Attempts to detect an executable located at start of |image|. If found,
22// returns the corresponding disassembler. Otherwise returns null.
23std::unique_ptr<Disassembler> MakeDisassemblerWithoutFallback(
24 ConstBufferView image);
25
26// Attempts to create a disassembler corresponding to |exe_type| and initialize
27// it with |image|, On failure, returns null.
28std::unique_ptr<Disassembler> MakeDisassemblerOfType(ConstBufferView image,
29 ExecutableType exe_type);
30
Etienne Pierre-dorayb90a9472021-10-28 21:16:04 +000031// Returns the version associated with disassembler of type |exe_type|.
32uint16_t DisassemblerVersionOfType(ExecutableType exe_type);
33
Samuel Huang06f1ae92018-03-13 18:19:34 +000034// Attempts to detect an element associated with |image| and returns it, or
35// returns nullopt if no element is detected.
36using ElementDetector =
Anton Bikineev1a965512021-05-15 22:35:36 +000037 base::RepeatingCallback<absl::optional<Element>(ConstBufferView image)>;
Samuel Huang06f1ae92018-03-13 18:19:34 +000038
39// Implementation of ElementDetector using disassemblers.
Anton Bikineev1a965512021-05-15 22:35:36 +000040absl::optional<Element> DetectElementFromDisassembler(ConstBufferView image);
Samuel Huang06f1ae92018-03-13 18:19:34 +000041
42// A class to scan through an image and iteratively detect elements.
43class ElementFinder {
44 public:
45 ElementFinder(ConstBufferView image, ElementDetector&& detector);
Samuel Huangf137bf42021-08-13 15:42:26 +000046 ElementFinder(const ElementFinder&) = delete;
47 const ElementFinder& operator=(const ElementFinder&) = delete;
Samuel Huang06f1ae92018-03-13 18:19:34 +000048 ~ElementFinder();
49
50 // Scans for the next executable using |detector|. Returns the next element
51 // found, or nullopt if no more element can be found.
Anton Bikineev1a965512021-05-15 22:35:36 +000052 absl::optional<Element> GetNext();
Samuel Huang06f1ae92018-03-13 18:19:34 +000053
54 private:
55 ConstBufferView image_;
56 ElementDetector detector_;
57 offset_t pos_ = 0;
Samuel Huang06f1ae92018-03-13 18:19:34 +000058};
59
60} // namespace zucchini
61
62#endif // COMPONENTS_ZUCCHINI_ELEMENT_DETECTION_H_