From ffd7058bec4b76ee58ef9a86c8f873e458c534e0 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sun, 11 Jan 2026 17:07:34 -0300 Subject: [PATCH 1/6] Fix NtCreateFile's create_disposition behavior --- src/common/platform/status.hpp | 1 + src/windows-emulator/syscalls/file.cpp | 26 ++++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/common/platform/status.hpp b/src/common/platform/status.hpp index 14c9e6c3..1fb015b9 100644 --- a/src/common/platform/status.hpp +++ b/src/common/platform/status.hpp @@ -43,6 +43,7 @@ using NTSTATUS = std::uint32_t; #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L) #define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L) +#define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS)0xC0000035L) #define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS)0xC0000045L) #define STATUS_MUTANT_NOT_OWNED ((NTSTATUS)0xC0000046L) #define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS)0xC0000047L) diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index 77e2e73c..7dee4148 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -1020,7 +1020,8 @@ namespace syscalls return STATUS_OBJECT_NAME_NOT_FOUND; } - const bool is_directory = std::filesystem::is_directory(c.win_emu.file_sys.translate(path), ec); + const auto host_path = c.win_emu.file_sys.translate(path); + const bool is_directory = std::filesystem::is_directory(host_path, ec); if (is_directory || create_options & FILE_DIRECTORY_FILE) { @@ -1028,7 +1029,7 @@ namespace syscalls if (create_disposition & FILE_CREATE) { - create_directory(c.win_emu.file_sys.translate(path), ec); + create_directory(host_path, ec); if (ec) { @@ -1048,6 +1049,27 @@ namespace syscalls c.win_emu.callbacks.on_generic_access("Opening file", f.name); + const bool file_exists = std::filesystem::exists(host_path, ec); + + if (create_disposition == FILE_CREATE && file_exists) + { + return STATUS_OBJECT_NAME_COLLISION; + } + + if ((create_disposition == FILE_OVERWRITE || create_disposition == FILE_OPEN) && !file_exists) + { + return STATUS_OBJECT_NAME_NOT_FOUND; + } + + if (create_disposition == FILE_OPEN_IF && !file_exists) + { + std::ofstream touch(host_path, std::ios::binary | std::ios::app); + if (!touch) + { + return STATUS_ACCESS_DENIED; + } + } + std::u16string mode = map_mode(desired_access, create_disposition); if (mode.empty() || path.is_relative()) From fc036ca2c518878488d3aeffbfbd4cb36943fc84 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sun, 11 Jan 2026 17:08:45 -0300 Subject: [PATCH 2/6] Fix wrong return value of user_handle_table::get_server_info --- src/common/platform/user.hpp | 8 ++++---- src/windows-emulator/user_handle_table.hpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/common/platform/user.hpp b/src/common/platform/user.hpp index 2bebdf4a..f625cb5f 100644 --- a/src/common/platform/user.hpp +++ b/src/common/platform/user.hpp @@ -23,7 +23,7 @@ struct USER_HANDLEENTRY uint64_t pHead; uint64_t pOwner; uint64_t unknown; - uint8_t bType; + EMULATOR_CAST(uint8_t, USER_HANDLETYPE) bType; uint8_t bFlags; uint16_t wUniq; }; @@ -31,10 +31,10 @@ static_assert(sizeof(USER_HANDLEENTRY) == 0x20); struct USER_SHAREDINFO { - uint64_t psi; - uint64_t aheList; + EMULATOR_CAST(uint64_t, USER_SERVERINFO*) psi; + EMULATOR_CAST(uint64_t, USER_HANDLEENTRY*) aheList; uint32_t HeEntrySize; - uint64_t pDispInfo; + EMULATOR_CAST(uint64_t, USER_DISPINFO*) pDispInfo; uint8_t unknown[0xFF]; }; diff --git a/src/windows-emulator/user_handle_table.hpp b/src/windows-emulator/user_handle_table.hpp index e3ad11f7..0be8744d 100644 --- a/src/windows-emulator/user_handle_table.hpp +++ b/src/windows-emulator/user_handle_table.hpp @@ -33,7 +33,7 @@ class user_handle_table handle_table_addr_ = this->allocate_memory(handle_table_size, memory_permission::read); } - emulator_object get_server_info() const + emulator_object get_server_info() const { return {*memory_, server_info_addr_}; } From f5fe795028230745e64c565f2fe8ebe994019f01 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sun, 11 Jan 2026 17:11:17 -0300 Subject: [PATCH 3/6] Fix inadvertent stack pointer overwriting in callback hook --- src/windows-emulator/process_context.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows-emulator/process_context.cpp b/src/windows-emulator/process_context.cpp index 3d3e2b3c..d98ec9bb 100644 --- a/src/windows-emulator/process_context.cpp +++ b/src/windows-emulator/process_context.cpp @@ -503,7 +503,7 @@ void process_context::setup_callback_hook(windows_emulator& win_emu, memory_mana target_rip += 2; } - const uint64_t ret_stack_ptr = frame.rsp - sizeof(emulator_pointer); + const uint64_t ret_stack_ptr = emu.reg(x86_register::rsp) - sizeof(emulator_pointer); emu.write_memory(ret_stack_ptr, &target_rip, sizeof(target_rip)); emu.reg(x86_register::rsp, ret_stack_ptr); }); From 2c93915ecca893a68755555d21723802bceeb951 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sun, 11 Jan 2026 17:12:15 -0300 Subject: [PATCH 4/6] Make Atom case-insensitive --- src/windows-emulator/process_context.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows-emulator/process_context.cpp b/src/windows-emulator/process_context.cpp index d98ec9bb..1ab58bb6 100644 --- a/src/windows-emulator/process_context.cpp +++ b/src/windows-emulator/process_context.cpp @@ -657,7 +657,7 @@ std::optional process_context::find_atom(const std::u16string_view nam { for (auto& entry : this->atoms) { - if (entry.second.name == name) + if (utils::string::equals_ignore_case(std::u16string_view{entry.second.name}, name)) { ++entry.second.ref_count; return entry.first; @@ -680,7 +680,7 @@ uint16_t process_context::add_or_find_atom(std::u16string name) std::optional last_entry{}; for (auto& entry : this->atoms) { - if (entry.second.name == name) + if (utils::string::equals_ignore_case(entry.second.name, name)) { ++entry.second.ref_count; return entry.first; @@ -714,7 +714,7 @@ bool process_context::delete_atom(const std::u16string& name) { for (auto it = atoms.begin(); it != atoms.end(); ++it) { - if (it->second.name == name) + if (utils::string::equals_ignore_case(it->second.name, name)) { if (--it->second.ref_count == 0) { From 271fb0f2706940477f076b03f696c624ed3156d9 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sun, 11 Jan 2026 17:12:40 -0300 Subject: [PATCH 5/6] Add useful comment to user_callback_dispatch header --- src/windows-emulator/user_callback_dispatch.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/windows-emulator/user_callback_dispatch.hpp b/src/windows-emulator/user_callback_dispatch.hpp index b74e647a..306272dc 100644 --- a/src/windows-emulator/user_callback_dispatch.hpp +++ b/src/windows-emulator/user_callback_dispatch.hpp @@ -6,6 +6,7 @@ // In the real implementation, the kernel invokes ntdll!KiUserCallbackDispatcher and passes a callback // index that refers to an entry in PEB->KernelCallbackTable. The dispatcher then looks up the function // pointer in that table and invokes the corresponding user-mode callback. +// See Also: https://web.archive.org/web/20080717175308/http://www.nynaeve.net/?p=204 template void prepare_call_stack(x86_64_emulator& emu, uint64_t return_address, Args... args) From e78bb8cd32eeb8bc457cc8207ccef72c2ad966ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 06:38:29 +0000 Subject: [PATCH 6/6] Build(deps): Bump react-router and react-router-dom in /page Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) to 7.12.0 and updates ancestor dependency [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom). These dependencies need to be updated together. Updates `react-router` from 7.11.0 to 7.12.0 - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router@7.12.0/packages/react-router) Updates `react-router-dom` from 7.11.0 to 7.12.0 - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@7.12.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router dependency-version: 7.12.0 dependency-type: indirect - dependency-name: react-router-dom dependency-version: 7.12.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- page/package-lock.json | 16 ++++++++-------- page/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/page/package-lock.json b/page/package-lock.json index 3905ea91..c0b8d8bf 100644 --- a/page/package-lock.json +++ b/page/package-lock.json @@ -34,7 +34,7 @@ "react-dom": "^19.2.3", "react-dropzone": "^14.3.8", "react-helmet": "^6.1.0", - "react-router-dom": "^7.11.0", + "react-router-dom": "^7.12.0", "react-window": "^2.2.3", "shell-quote": "^1.8.3", "tailwind-merge": "^3.4.0", @@ -8118,9 +8118,9 @@ } }, "node_modules/react-router": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.11.0.tgz", - "integrity": "sha512-uI4JkMmjbWCZc01WVP2cH7ZfSzH91JAZUDd7/nIprDgWxBV1TkkmLToFh7EbMTcMak8URFRa2YoBL/W8GWnCTQ==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz", + "integrity": "sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -8140,12 +8140,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.11.0.tgz", - "integrity": "sha512-e49Ir/kMGRzFOOrYQBdoitq3ULigw4lKbAyKusnvtDu2t4dBX4AGYPrzNvorXmVuOyeakai6FUPW5MmibvVG8g==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.12.0.tgz", + "integrity": "sha512-pfO9fiBcpEfX4Tx+iTYKDtPbrSLLCbwJ5EqP+SPYQu1VYCXdy79GSj0wttR0U4cikVdlImZuEZ/9ZNCgoaxwBA==", "license": "MIT", "dependencies": { - "react-router": "7.11.0" + "react-router": "7.12.0" }, "engines": { "node": ">=20.0.0" diff --git a/page/package.json b/page/package.json index c86e57dd..83efbc3d 100644 --- a/page/package.json +++ b/page/package.json @@ -36,7 +36,7 @@ "react-dom": "^19.2.3", "react-dropzone": "^14.3.8", "react-helmet": "^6.1.0", - "react-router-dom": "^7.11.0", + "react-router-dom": "^7.12.0", "react-window": "^2.2.3", "shell-quote": "^1.8.3", "tailwind-merge": "^3.4.0",