Add hardware breakpoint support (#124)

This commit is contained in:
Maurice Heumann
2025-02-04 19:22:27 +01:00
committed by GitHub
4 changed files with 24 additions and 9 deletions

2
deps/unicorn vendored

View File

@@ -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)

View File

@@ -1042,7 +1042,7 @@ namespace
return STATUS_SUCCESS;
}
if (info_class == SystemProcessInformation)
if (info_class == SystemProcessInformation || info_class == SystemModuleInformation)
{
return STATUS_NOT_SUPPORTED;
}
@@ -3497,6 +3497,11 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtUserFindWindowEx()
{
return 0;
}
NTSTATUS handle_NtGetNextThread(const syscall_context& c, const handle process_handle, const handle thread_handle,
const ACCESS_MASK /*desired_access*/, const ULONG /*handle_attributes*/,
const ULONG flags, const emulator_object<handle> new_thread_handle)
@@ -3728,6 +3733,7 @@ void syscall_dispatcher::add_handlers(std::map<std::string, syscall_handler>& ha
add_handler(NtUserReleaseDC);
add_handler(NtUserFindExistingCursorIcon);
add_handler(NtSetContextThread);
add_handler(NtUserFindWindowEx);
#undef add_handler
}

View File

@@ -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();