From 9d71a3bbf27f508fdde74227779457475e170703 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Feb 2025 12:53:07 +0100 Subject: [PATCH 1/6] Make emulator_object bool operator explicit --- src/windows-emulator/emulator_utils.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows-emulator/emulator_utils.hpp b/src/windows-emulator/emulator_utils.hpp index fdab413b..61114451 100644 --- a/src/windows-emulator/emulator_utils.hpp +++ b/src/windows-emulator/emulator_utils.hpp @@ -84,7 +84,7 @@ class emulator_object return reinterpret_cast(this->address_); } - operator bool() const + explicit operator bool() const { return this->address_ != 0; } From d85c6750704a4b1dd2d2e72ee26f81a072c56f5d Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Feb 2025 12:53:29 +0100 Subject: [PATCH 2/6] Small fixes --- src/windows-emulator/syscalls.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index e85aeba6..38ee196b 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -1506,7 +1506,7 @@ namespace return_length.write(sizeof(THREAD_BASIC_INFORMATION64)); } - if (thread_information_length != sizeof(THREAD_BASIC_INFORMATION64)) + if (thread_information_length < sizeof(THREAD_BASIC_INFORMATION64)) { return STATUS_BUFFER_OVERFLOW; } @@ -1527,7 +1527,7 @@ namespace return_length.write(sizeof(ULONG)); } - if (thread_information_length != sizeof(ULONG)) + if (thread_information_length < sizeof(ULONG)) { return STATUS_BUFFER_OVERFLOW; } @@ -1545,7 +1545,7 @@ namespace return_length.write(sizeof(EmulatorTraits::PVOID)); } - if (thread_information_length != sizeof(EmulatorTraits::PVOID)) + if (thread_information_length < sizeof(EmulatorTraits::PVOID)) { return STATUS_BUFFER_OVERFLOW; } From f958791f357956ae778380fd94c29dc33d103930 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Feb 2025 12:53:40 +0100 Subject: [PATCH 3/6] Fix NtReadVirtualMemory --- src/windows-emulator/syscalls.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 38ee196b..c27f5c98 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -2264,7 +2264,7 @@ namespace } std::vector memory{}; - memory.resize(number_of_bytes_read); + memory.resize(number_of_bytes_to_read); if (!c.emu.try_read_memory(base_address, memory.data(), memory.size())) { From 27e5ef0214a3c6a48741d9c13a727c5f77a6ad05 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Feb 2025 12:54:01 +0100 Subject: [PATCH 4/6] Support Nsi device --- src/windows-emulator/io_device.cpp | 1 + src/windows-emulator/syscalls.cpp | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/windows-emulator/io_device.cpp b/src/windows-emulator/io_device.cpp index 2cc9e87a..e96329a0 100644 --- a/src/windows-emulator/io_device.cpp +++ b/src/windows-emulator/io_device.cpp @@ -16,6 +16,7 @@ namespace std::unique_ptr create_device(const std::u16string_view device) { if (device == u"CNG" // + || device == u"Nsi" // || device == u"KsecDD" // || device == u"PcwDrv" // || device == u"DeviceApi\\CMApi" // diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index c27f5c98..bc2e25fe 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -2918,9 +2918,22 @@ namespace return filename.substr(device_prefix.size()); } - if (filename.starts_with(u"\\??\\MountPointManager")) + constexpr std::u16string_view unc_prefix = u"\\??\\"; + if (!filename.starts_with(unc_prefix)) { - return u"MountPointManager"; + return std::nullopt; + } + + const auto path = filename.substr(unc_prefix.size()); + + const std::set> devices{ + u"Nsi", + u"MountPointManager", + }; + + if (devices.contains(path)) + { + return path; } return std::nullopt; From d4fb81378f3ed024d6a952c97b1446d6518c5ef6 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Feb 2025 12:54:14 +0100 Subject: [PATCH 5/6] Fix path translation --- src/windows-emulator/syscalls.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index bc2e25fe..57db80a6 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -2951,8 +2951,9 @@ namespace auto filename = read_unicode_string(c.emu, reinterpret_cast>*>(attributes.ObjectName)); - auto printer = utils::finally( - [&] { c.win_emu.log.print(color::dark_gray, "--> Opening file: %s\n", u16_to_u8(filename).c_str()); }); + auto printer = utils::finally([&] { + c.win_emu.log.print(color::dark_gray, "--> Opening file: %s\n", u16_to_u8(filename).c_str()); // + }); const auto io_device_name = get_io_device_name(filename); if (io_device_name.has_value()) @@ -3022,16 +3023,17 @@ namespace c.win_emu.log.print(color::dark_gray, "--> Opening file: %s\n", u16_to_u8(f.name).c_str()); + const windows_path path = f.name; std::u16string mode = map_mode(desired_access, create_disposition); - if (mode.empty()) + if (mode.empty() || path.is_relative()) { return STATUS_NOT_SUPPORTED; } FILE* file{}; - const auto error = open_unicode(&file, c.win_emu.file_sys().translate(f.name), mode); + const auto error = open_unicode(&file, c.win_emu.file_sys().translate(path), mode); if (!file) { From 07a86522cbecfb7467ed3731dcd539994e34735b Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Feb 2025 12:54:28 +0100 Subject: [PATCH 6/6] Support ThreadTebInformation query --- src/common/platform/threading.hpp | 7 +++++++ src/windows-emulator/syscalls.cpp | 20 +++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/common/platform/threading.hpp b/src/common/platform/threading.hpp index 7594e991..f3fe70fd 100644 --- a/src/common/platform/threading.hpp +++ b/src/common/platform/threading.hpp @@ -80,3 +80,10 @@ typedef struct _THREAD_BASIC_INFORMATION64 EMULATOR_CAST(std::uint32_t, KPRIORITY) Priority; EMULATOR_CAST(std::uint32_t, KPRIORITY) BasePriority; } THREAD_BASIC_INFORMATION64, *PTHREAD_BASIC_INFORMATION64; + +typedef struct _THREAD_TEB_INFORMATION +{ + EmulatorTraits::PVOID TebInformation; // Buffer to write data into. + ULONG TebOffset; // Offset in TEB to begin reading from. + ULONG BytesToRead; // Number of bytes to read. +} THREAD_TEB_INFORMATION, *PTHREAD_TEB_INFORMATION; diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 57db80a6..1f2c96b6 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -1499,6 +1499,25 @@ namespace return STATUS_INVALID_HANDLE; } + if (info_class == ThreadTebInformation) + { + if (return_length) + { + return_length.write(sizeof(THREAD_TEB_INFORMATION)); + } + + if (thread_information_length < sizeof(THREAD_TEB_INFORMATION)) + { + return STATUS_BUFFER_OVERFLOW; + } + + const auto teb_info = c.emu.read_memory(thread_information); + const auto data = c.emu.read_memory(thread->teb->value() + teb_info.TebOffset, teb_info.BytesToRead); + c.emu.write_memory(teb_info.TebInformation, data.data(), data.size()); + + return STATUS_SUCCESS; + } + if (info_class == ThreadBasicInformation) { if (return_length) @@ -2909,7 +2928,6 @@ namespace return mode; } - std::optional get_io_device_name(const std::u16string_view filename) { constexpr std::u16string_view device_prefix = u"\\Device\\";