diff --git a/src/common/platform/compiler.hpp b/src/common/platform/compiler.hpp index eda34323..34c1cc4d 100644 --- a/src/common/platform/compiler.hpp +++ b/src/common/platform/compiler.hpp @@ -28,6 +28,7 @@ #define DECLSPEC_ALIGN(n) alignas(n) #define fopen_s fopen +#define sscanf_s sscanf #define RESTRICTED_POINTER __restrict diff --git a/src/gdb-stub/async_handler.cpp b/src/gdb-stub/async_handler.cpp index 8afb0ce3..4af41429 100644 --- a/src/gdb-stub/async_handler.cpp +++ b/src/gdb-stub/async_handler.cpp @@ -58,6 +58,7 @@ namespace gdb_stub { while (!this->run_ && !this->stop_) { + this->is_running_ = false; std::this_thread::sleep_for(10ms); } diff --git a/src/gdb-stub/gdb_stub.cpp b/src/gdb-stub/gdb_stub.cpp index 2dfa44e2..5ff29756 100644 --- a/src/gdb-stub/gdb_stub.cpp +++ b/src/gdb-stub/gdb_stub.cpp @@ -126,7 +126,7 @@ namespace gdb_stub uint32_t type{}; uint64_t addr{}; size_t kind{}; - rt_assert(sscanf(data.c_str(), "%x,%" PRIX64 ",%zx", &type, &addr, &kind) == 3); + rt_assert(sscanf_s(data.c_str(), "%x,%" PRIX64 ",%zx", &type, &addr, &kind) == 3); const auto res = change_breakpoint(handler, set, translate_breakpoint_type(type), addr, kind); connection.send_reply(res ? "OK" : "E01"); diff --git a/src/windows-emulator/debugging/win_x64_gdb_stub_handler.hpp b/src/windows-emulator/debugging/win_x64_gdb_stub_handler.hpp index 7f9574b6..df9d1261 100644 --- a/src/windows-emulator/debugging/win_x64_gdb_stub_handler.hpp +++ b/src/windows-emulator/debugging/win_x64_gdb_stub_handler.hpp @@ -12,7 +12,7 @@ class win_x64_gdb_stub_handler : public x64_gdb_stub_handler { } - gdb_stub::gdb_action cont() override + gdb_stub::gdb_action run() override { try { @@ -26,7 +26,7 @@ class win_x64_gdb_stub_handler : public x64_gdb_stub_handler return gdb_stub::gdb_action::resume; } - gdb_stub::gdb_action stepi() override + gdb_stub::gdb_action singlestep() override { try { @@ -40,7 +40,7 @@ class win_x64_gdb_stub_handler : public x64_gdb_stub_handler return gdb_stub::gdb_action::resume; } - std::string get_target_description() const override + std::string get_target_description() override { return "i386:x86-64"; } diff --git a/src/windows-emulator/debugging/x64_gdb_stub_handler.hpp b/src/windows-emulator/debugging/x64_gdb_stub_handler.hpp index fae1fe04..e5e147cc 100644 --- a/src/windows-emulator/debugging/x64_gdb_stub_handler.hpp +++ b/src/windows-emulator/debugging/x64_gdb_stub_handler.hpp @@ -68,7 +68,7 @@ class x64_gdb_stub_handler : public gdb_stub::gdb_stub_handler ~x64_gdb_stub_handler() override = default; - gdb_stub::gdb_action cont() override + gdb_stub::gdb_action run() override { try { @@ -82,7 +82,7 @@ class x64_gdb_stub_handler : public gdb_stub::gdb_stub_handler return gdb_stub::gdb_action::resume; } - gdb_stub::gdb_action stepi() override + gdb_stub::gdb_action singlestep() override { try { @@ -96,36 +96,26 @@ class x64_gdb_stub_handler : public gdb_stub::gdb_stub_handler return gdb_stub::gdb_action::resume; } - bool read_reg(const int regno, size_t* value) override + size_t get_register_count() override { - *value = 0; - - try - { - if (static_cast(regno) >= gdb_registers.size()) - { - return true; - } - - this->emu_->read_register(gdb_registers[regno], value, sizeof(*value)); - return true; - } - catch (...) - { - return true; - } + return gdb_registers.size(); } - bool write_reg(const int regno, const size_t value) override + size_t get_max_register_size() override + { + return 256 / 8; + } + + bool read_register(const size_t reg, void* data, const size_t max_length) override { try { - if (static_cast(regno) >= gdb_registers.size()) + if (reg >= gdb_registers.size()) { - return true; + return false; } - this->emu_->write_register(gdb_registers[regno], &value, sizeof(value)); + this->emu_->read_register(gdb_registers[reg], data, max_length); return true; } catch (...) @@ -134,16 +124,16 @@ class x64_gdb_stub_handler : public gdb_stub::gdb_stub_handler } } - bool read_mem(const size_t addr, const size_t len, void* val) override - { - return this->emu_->try_read_memory(addr, val, len); - } - - bool write_mem(const size_t addr, const size_t len, void* val) override + bool write_register(const size_t reg, const void* data, const size_t size) override { try { - this->emu_->write_memory(addr, val, len); + if (reg >= gdb_registers.size()) + { + return false; + } + + this->emu_->write_register(gdb_registers[reg], data, size); return true; } catch (...) @@ -152,7 +142,25 @@ class x64_gdb_stub_handler : public gdb_stub::gdb_stub_handler } } - bool set_bp(const gdb_stub::breakpoint_type type, const size_t addr, const size_t size) override + bool read_memory(const uint64_t address, void* data, const size_t length) override + { + return this->emu_->try_read_memory(address, data, length); + } + + bool write_memory(const uint64_t address, const void* data, const size_t length) override + { + try + { + this->emu_->write_memory(address, data, length); + return true; + } + catch (...) + { + return false; + } + } + + bool set_breakpoint(const gdb_stub::breakpoint_type type, const uint64_t addr, const size_t size) override { try { @@ -172,7 +180,7 @@ class x64_gdb_stub_handler : public gdb_stub::gdb_stub_handler } } - bool del_bp(const gdb_stub::breakpoint_type type, const size_t addr, const size_t size) override + bool delete_breakpoint(const gdb_stub::breakpoint_type type, const uint64_t addr, const size_t size) override { try {