diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-05-29 17:41:36 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-29 11:41:36 +0200 |
| commit | 67b15f09cfdde0053be16c99ebbf5db20e61c1e5 (patch) | |
| tree | 6a3bbe89cfd172eac56b3bb016f3d807a510970e /src/os/emit_signal_wine.c | |
| parent | a0693590bd9c84844bfa767ffe51d7da916df3d5 (diff) | |
| download | box64-67b15f09cfdde0053be16c99ebbf5db20e61c1e5.tar.gz box64-67b15f09cfdde0053be16c99ebbf5db20e61c1e5.zip | |
[WOW64] Added more missing pieces and the interpreter works (#2682)
* [WOW64] Added more missing pieces and the interpreter works Ported from AndreRH/hangover * review
Diffstat (limited to 'src/os/emit_signal_wine.c')
| -rw-r--r-- | src/os/emit_signal_wine.c | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/src/os/emit_signal_wine.c b/src/os/emit_signal_wine.c index 0539a818..ef0a0f65 100644 --- a/src/os/emit_signal_wine.c +++ b/src/os/emit_signal_wine.c @@ -1,22 +1,64 @@ +/* + * Copyright 2022-2025 André Zwing + * Copyright 2023 Alexandre Julliard + */ +#include <signal.h> +#include <windows.h> +#include <winternl.h> + #include "x64emu.h" +#include "debug.h" #include "custommem.h" +#include "wine/compiler.h" void EmitSignal(x64emu_t* emu, int sig, void* addr, int code) { - // FIXME + EXCEPTION_RECORD rec; + + switch (sig) { + case SIGILL: + printf_log(LOG_DEBUG, "SIGILL at %p with code %d\n", addr, code); + rec.ExceptionCode = STATUS_ILLEGAL_INSTRUCTION; + break; + case SIGSEGV: + printf_log(LOG_DEBUG, "SIGSEGV at %p with code %d\n", addr, code); + rec.ExceptionCode = STATUS_ACCESS_VIOLATION; + break; + default: + printf_log(LOG_INFO, "Warning, unknown signal %d at %p with code %d\n", sig, addr, code); + rec.ExceptionCode = STATUS_ACCESS_VIOLATION; + break; + } + rec.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + rec.ExceptionRecord = NULL; + rec.ExceptionAddress = addr; + rec.NumberParameters = 0; + RtlRaiseException(&rec); } void CheckExec(x64emu_t* emu, uintptr_t addr) { - // FIXME } -void EmitInterruption(x64emu_t* emu, int num, void* addr) +void EmitDiv0(x64emu_t* emu, void* addr, int code) { - // FIXME + EXCEPTION_RECORD rec; + rec.ExceptionCode = EXCEPTION_INT_DIVIDE_BY_ZERO; + rec.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + rec.ExceptionRecord = NULL; + rec.ExceptionAddress = addr; + rec.NumberParameters = 0; + RtlRaiseException(&rec); } -void EmitDiv0(x64emu_t* emu, void* addr, int code) +void EmuInt3(void* emu, void* addr) { - // FIXME + EXCEPTION_RECORD rec; + + rec.ExceptionCode = STATUS_BREAKPOINT; + rec.ExceptionFlags = 0; + rec.ExceptionRecord = NULL; + rec.ExceptionAddress = addr; + rec.NumberParameters = 0; + RtlRaiseException(&rec); } |