about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-07 15:33:23 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-07 15:33:23 +0100
commit28f69afe9635a7a1313450aecfec8ae7332557a7 (patch)
tree561365c43edb0d91446156583f8104fcf9d02ff4 /src
parent2827e9e253393e2546554d14d813c1bb2ad04dcd (diff)
downloadbox64-28f69afe9635a7a1313450aecfec8ae7332557a7.tar.gz
box64-28f69afe9635a7a1313450aecfec8ae7332557a7.zip
Refined ptrace hacks around POKEUSER/PEEKUSER (should help Wine Unity3D games)
Diffstat (limited to 'src')
-rw-r--r--src/wrapped/wrappedlibc.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index cd68e7e0..ac600229 100644
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -3004,7 +3004,7 @@ EXPORT int my_semctl(int semid, int semnum, int cmd, union semun b)
     return ret;
 }
 
-EXPORT const uint64_t userdata_sign = 0x1234598765ABCEF0;
+EXPORT uint64_t userdata_sign = 0x1234598765ABCEF0;
 EXPORT uint32_t userdata[1024]; 
 
 EXPORT long my_ptrace(x64emu_t* emu, int request, pid_t pid, void* addr, uint32_t* data)
@@ -3014,6 +3014,9 @@ EXPORT long my_ptrace(x64emu_t* emu, int request, pid_t pid, void* addr, uint32_
             ptrace(PTRACE_POKEDATA, pid, addr+(uintptr_t)userdata, data);
             return 0;
         }
+        // fallback to a generic local faking
+        if((uintptr_t)addr < sizeof(userdata))
+            *(uintptr_t*)(addr+(uintptr_t)userdata) = (uintptr_t)data;
         // lets just ignore this for now!
         return 0;
     }
@@ -3021,6 +3024,9 @@ EXPORT long my_ptrace(x64emu_t* emu, int request, pid_t pid, void* addr, uint32_
         if(ptrace(PTRACE_PEEKDATA, pid, &userdata_sign, NULL)==userdata_sign  && (uintptr_t)addr < sizeof(userdata)) {
             return ptrace(PTRACE_PEEKDATA, pid, addr+(uintptr_t)userdata, data);
         }
+        // fallback to a generic local faking
+        if((uintptr_t)addr < sizeof(userdata))
+            return *(uintptr_t*)(addr+(uintptr_t)userdata);
     }
     return ptrace(request, pid, addr, data);
 }