aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--subhook.c2
-rw-r--r--subhook.h5
-rw-r--r--subhook_macos.c75
-rw-r--r--subhook_unix.c20
-rw-r--r--tests/test.c2
-rw-r--r--tests/test.cpp2
7 files changed, 24 insertions, 84 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index afc4c11..84999c4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -37,8 +37,6 @@ set(SUBHOOK_HEADERS subhook.h)
set(SUBHOOK_SOURCES subhook.c subhook_private.h subhook_x86.c)
if(WIN32)
list(APPEND SUBHOOK_SOURCES subhook_windows.c)
-elseif(APPLE)
- list(APPEND SUBHOOK_SOURCES subhook_macos.c)
elseif(UNIX)
list(APPEND SUBHOOK_SOURCES subhook_unix.c)
endif()
diff --git a/subhook.c b/subhook.c
index 1c96888..8ea7d51 100644
--- a/subhook.c
+++ b/subhook.c
@@ -68,8 +68,6 @@ SUBHOOK_EXPORT void SUBHOOK_API subhook_set_disasm_handler(
#include "subhook_windows.c"
#elif defined SUBHOOK_UNIX
#include "subhook_unix.c"
-#elif defined SUBHOOK_APPLE
- #include "subhook_macos.c"
#endif
#if defined SUBHOOK_X86 || defined SUBHOOK_X86_64
diff --git a/subhook.h b/subhook.h
index d8216c6..5633f39 100644
--- a/subhook.h
+++ b/subhook.h
@@ -46,6 +46,7 @@
#define SUBHOOK_UNIX
#elif defined __APPLE__
#define SUBHOOK_APPLE
+ #define SUBHOOK_UNIX
#else
#error Unsupported operating system
#endif
@@ -67,7 +68,7 @@
#if defined SUBHOOK_X86
#if defined SUBHOOK_WINDOWS
#define SUBHOOK_API __cdecl
- #elif defined SUBHOOK_UNIX || defined SUBHOOK_APPLE
+ #elif defined SUBHOOK_UNIX
#define SUBHOOK_API __attribute__((cdecl))
#endif
#else
@@ -82,7 +83,7 @@
#else
#define SUBHOOK_EXPORT SUBHOOK_EXTERN __declspec(dllimport)
#endif
- #elif defined SUBHOOK_UNIX || defined SUBHOOK_APPLE
+ #elif defined SUBHOOK_UNIX
#if defined SUBHOOK_IMPLEMENTATION
#define SUBHOOK_EXPORT SUBHOOK_EXTERN __attribute__((visibility("default")))
#else
diff --git a/subhook_macos.c b/subhook_macos.c
deleted file mode 100644
index 866edf5..0000000
--- a/subhook_macos.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2012-2018 Zeex
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stddef.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <mach/mach.h>
-
-#define SUBHOOK_CODE_PROTECT_FLAGS (PROT_READ | PROT_WRITE | PROT_EXEC)
-
-int subhook_unprotect(void *address, size_t size) {
- long pagesize;
-
- pagesize = sysconf(_SC_PAGESIZE);
- address = (void *)((long)address & ~(pagesize - 1));
- int error = mprotect(address, size, SUBHOOK_CODE_PROTECT_FLAGS);
-
- if (-1 == error)
- {
- // If mprotect fails, try to use VM_PROT_COPY with vm_protect
- kern_return_t kret = vm_protect(mach_task_self(), (unsigned long)address, size, 0, SUBHOOK_CODE_PROTECT_FLAGS | VM_PROT_COPY);
- if (kret != KERN_SUCCESS)
- {
- error = -1;
- }
- error = 0;
- }
-
- return error;
-}
-
-void *subhook_alloc_code(size_t size) {
- void *address;
-
- address = mmap(NULL,
- size,
- SUBHOOK_CODE_PROTECT_FLAGS,
- #if defined MAP_32BIT && !defined __APPLE__
- MAP_32BIT |
- #endif
- MAP_PRIVATE | MAP_ANONYMOUS,
- -1,
- 0);
- return address == MAP_FAILED ? NULL : address;
-}
-
-int subhook_free_code(void *address, size_t size) {
- if (address == NULL) {
- return 0;
- }
- return munmap(address, size);
-}
diff --git a/subhook_unix.c b/subhook_unix.c
index 6a5410b..4d9c03a 100644
--- a/subhook_unix.c
+++ b/subhook_unix.c
@@ -27,6 +27,11 @@
#include <stddef.h>
#include <unistd.h>
#include <sys/mman.h>
+#include "subhook.h"
+#ifdef SUBHOOK_APPLE
+#include <mach/mach.h>
+#endif
+
#define SUBHOOK_CODE_PROTECT_FLAGS (PROT_READ | PROT_WRITE | PROT_EXEC)
@@ -36,7 +41,20 @@ int subhook_unprotect(void *address, size_t size) {
pagesize = sysconf(_SC_PAGESIZE);
address = (void *)((long)address & ~(pagesize - 1));
- return mprotect(address, size, SUBHOOK_CODE_PROTECT_FLAGS);
+ int error = mprotect(address, size, SUBHOOK_CODE_PROTECT_FLAGS);
+#ifdef SUBHOOK_APPLE
+ if (-1 == error)
+ {
+ /* If mprotect fails, try to use VM_PROT_COPY with vm_protect. */
+ kern_return_t kret = vm_protect(mach_task_self(), (unsigned long)address, size, 0, SUBHOOK_CODE_PROTECT_FLAGS | VM_PROT_COPY);
+ if (kret != KERN_SUCCESS)
+ {
+ error = -1;
+ }
+ error = 0;
+ }
+#endif
+ return error;
}
void *subhook_alloc_code(size_t size) {
diff --git a/tests/test.c b/tests/test.c
index 5526653..d8b39fd 100644
--- a/tests/test.c
+++ b/tests/test.c
@@ -8,7 +8,7 @@ typedef void (*foo_func_t)(void);
#ifdef SUBHOOK_X86
#if defined SUBHOOK_WINDOWS
#define FOO_CALL __cdecl
- #elif defined SUBHOOK_UNIX || defined SUBHOOK_APPLE
+ #elif defined SUBHOOK_UNIX
#define FOO_CALL __attribute__((cdecl))
#endif
#endif
diff --git a/tests/test.cpp b/tests/test.cpp
index 30b7ca4..7ba167a 100644
--- a/tests/test.cpp
+++ b/tests/test.cpp
@@ -7,7 +7,7 @@ typedef void (*foo_func_t)();
#ifdef SUBHOOK_X86
#if defined SUBHOOK_WINDOWS
#define FOO_CALL __cdecl
- #elif defined SUBHOOK_UNIX || defined SUBHOOK_APPLE
+ #elif defined SUBHOOK_UNIX
#define FOO_CALL __attribute__((cdecl))
#endif
#endif