|
- #pragma once
- class AbstractHookEngine {
- private:
- const char* name_;
-
- public:
- /* boolean for each hook test case, which are set by the hooks */
- struct {
- bool small_;
- bool branch;
- bool rip_relative;
-
- bool avx;
- bool rdrand;
-
- bool loop;
- bool tail_recursion;
- };
- public:
- AbstractHookEngine(const char* name) :
- name_(name),
- small_(false),
- branch(false),
- rip_relative(false),
- avx(false),
- rdrand(false),
- loop(false),
- tail_recursion(false)
- {
-
- }
-
- virtual bool hook_all() = 0;
- virtual bool unhook_all() = 0;
-
- bool all_hooked() const {
- return small_ && branch && rip_relative && avx && rdrand && loop && tail_recursion;
- }
-
- const char* name() const {
- return name_;
- }
-
- friend std::ostream& operator<< (std::ostream& stream, const AbstractHookEngine& eng) {
- std::cout << '|' << std::setw(10) << eng.name() << std::setw(1) << '|' <<
- (eng.small_ ? 'X' : ' ') << '|' <<
- (eng.branch ? 'X' : ' ') << '|' <<
- (eng.rip_relative ? 'X' : ' ') << '|' <<
- (eng.avx ? 'X' : ' ') << '|' <<
- (eng.rdrand ? 'X' : ' ') << '|' <<
- (eng.loop ? 'X' : ' ') << '|' <<
- (eng.tail_recursion ? 'X' : ' ') << '|';
-
- return stream;
- }
- };
|