aboutsummaryrefslogtreecommitdiff
path: root/subhook_unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'subhook_unix.c')
-rw-r--r--subhook_unix.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/subhook_unix.c b/subhook_unix.c
index 31f927e..3bde083 100644
--- a/subhook_unix.c
+++ b/subhook_unix.c
@@ -28,15 +28,26 @@
#include <unistd.h>
#include <sys/mman.h>
-void *subhook_unprotect(void *address, size_t size) {
+#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));
- if (mprotect(address, size, PROT_READ | PROT_WRITE | PROT_EXEC) == 0) {
- return address;
- } else {
- return NULL;
- }
+ return mprotect(address, size, SUBHOOK_CODE_PROTECT_FLAGS);
+}
+
+void *subhook_alloc_code(size_t size) {
+ return mmap(NULL,
+ size,
+ SUBHOOK_CODE_PROTECT_FLAGS,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_32BIT,
+ -1,
+ 0);
+}
+
+int subhok_free_code(void *address, size_t size) {
+ return munmap(address, size);
}