aboutsummaryrefslogtreecommitdiff
path: root/tests/test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test.cpp')
-rw-r--r--tests/test.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/tests/test.cpp b/tests/test.cpp
new file mode 100644
index 0000000..0eee1fa
--- /dev/null
+++ b/tests/test.cpp
@@ -0,0 +1,75 @@
+#include <iostream>
+#include <subhook.h>
+
+typedef void (*foo_func_t)();
+
+#ifdef SUBHOOK_X86
+ #if defined SUBHOOK_WINDOWS
+ #define FOO_CALL __cdecl
+ #elif defined SUBHOOK_UNIX
+ #define FOO_CALL __attribute__((cdecl))
+ #endif
+#else
+ #define FOO_CALL
+#endif
+
+extern "C" void FOO_CALL foo();
+foo_func_t foo_tr = nullptr;
+
+void foo_hooked() {
+ std::cout << "foo_hooked() called" << std::endl;;
+}
+
+void foo_hooked_tr() {
+ std::cout << "foo_hooked_tr() called" << std::endl;
+ foo_tr();
+}
+
+int main() {
+ std::cout << "Testing initial install" << std::endl;
+
+ subhook::Hook foo_hook((void *)foo,
+ (void *)foo_hooked,
+ subhook::HookFlag64BitOffset);
+ if (!foo_hook.Install()) {
+ std::cout << "Install failed" << std::endl;
+ return EXIT_FAILURE;
+ }
+ foo();
+ if (!foo_hook.Remove()) {
+ std::cout << "Remove failed" << std::endl;
+ return EXIT_FAILURE;
+ }
+ foo();
+
+ std::cout << "Testing re-install" << std::endl;
+
+ if (!foo_hook.Install()) {
+ std::cout << "Install failed" << std::endl;
+ return EXIT_FAILURE;
+ }
+ foo();
+ if (!foo_hook.Remove()) {
+ std::cout << "Remove failed" << std::endl;
+ return EXIT_FAILURE;
+ }
+ foo();
+
+ std::cout << "Testing trampoline" << std::endl;
+
+ subhook::Hook foo_hook_tr((void *)foo,
+ (void *)foo_hooked_tr,
+ subhook::HookFlag64BitOffset);
+ if (!foo_hook_tr.Install()) {
+ std::cout << "Install failed" << std::endl;
+ return EXIT_FAILURE;
+ }
+ foo_tr = (foo_func_t)foo_hook_tr.GetTrampoline();
+ if (foo_tr == nullptr) {
+ std::cout << "Failed to build trampoline" << std::endl;
+ return EXIT_FAILURE;
+ }
+ foo();
+
+ return EXIT_SUCCESS;
+}