diff --git a/deps/unicorn b/deps/unicorn index 9a6618ba..73be28b6 160000 --- a/deps/unicorn +++ b/deps/unicorn @@ -1 +1 @@ -Subproject commit 9a6618baf899d515b8eccd22c1eec532bfbc7cd6 +Subproject commit 73be28b6509d0cbf3333071aec4efbb9be1f1e59 diff --git a/src/common/platform/status.hpp b/src/common/platform/status.hpp index 8c60d27d..0d0d9b62 100644 --- a/src/common/platform/status.hpp +++ b/src/common/platform/status.hpp @@ -7,14 +7,15 @@ using NTSTATUS = std::uint32_t; #ifndef OS_WINDOWS #define STATUS_WAIT_0 ((NTSTATUS)0x00000000L) #define STATUS_TIMEOUT ((NTSTATUS)0x00000102L) +#define STATUS_PENDING ((NTSTATUS)0x00000103L) + +#define STATUS_SINGLE_STEP ((NTSTATUS)0x80000004L) #define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L) #define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008L) #define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000DL) #define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS)0xC000001DL) #define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS)0xC0000094L) - -#define STATUS_PENDING ((NTSTATUS)0x00000103L) #endif #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) diff --git a/src/windows-emulator/windows_emulator.cpp b/src/windows-emulator/windows_emulator.cpp index 2e83cd40..4446c827 100644 --- a/src/windows-emulator/windows_emulator.cpp +++ b/src/windows-emulator/windows_emulator.cpp @@ -505,6 +505,11 @@ namespace dispatch_exception(emu, proc, STATUS_INTEGER_DIVIDE_BY_ZERO, {}); } + void dispatch_single_step(x64_emulator& emu, const process_context& proc) + { + dispatch_exception(emu, proc, STATUS_SINGLE_STEP, {}); + } + void perform_context_switch_work(windows_emulator& win_emu) { auto& devices = win_emu.process().devices; @@ -1033,16 +1038,19 @@ void windows_emulator::setup_hooks() }); this->emu().hook_interrupt([&](const int interrupt) { - if (interrupt == 0) + switch (interrupt) { + case 0: dispatch_integer_division_by_zero(this->emu(), this->process()); return; - } - - if (interrupt == 6) - { + case 1: + dispatch_single_step(this->emu(), this->process()); + return; + case 6: dispatch_illegal_instruction_violation(this->emu(), this->process()); return; + default: + break; } const auto rip = this->emu().read_instruction_pointer();