diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-11-07 15:33:23 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-11-07 15:33:23 +0100 |
| commit | 28f69afe9635a7a1313450aecfec8ae7332557a7 (patch) | |
| tree | 561365c43edb0d91446156583f8104fcf9d02ff4 /src | |
| parent | 2827e9e253393e2546554d14d813c1bb2ad04dcd (diff) | |
| download | box64-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.c | 8 |
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); } |