diff --git a/src/tools/create-root.bat b/src/tools/create-root.bat index 975b7bea..c93361c2 100644 --- a/src/tools/create-root.bat +++ b/src/tools/create-root.bat @@ -118,8 +118,18 @@ CALL :collect wintypes.dll CALL :collect slwga.dll CALL :collect sppc.dll CALL :collect kernel.appcore.dll +CALL :collect winnlsres.dll +CALL :collect nlsbres.dll +CALL :collect netutils.dll +CALL :collect dinput8.dll +CALL :collect d3d10.dll +CALL :collect d3d10core.dll +CALL :collect cabinet.dll +CALL :collect msacm32.dll CALL :collect locale.nls +CALL :collect c_1252.nls +CALL :collect c_850.nls EXIT /B 0 diff --git a/src/windows-emulator/registry/registry_manager.cpp b/src/windows-emulator/registry/registry_manager.cpp index cd3d75fb..3309f1e5 100644 --- a/src/windows-emulator/registry/registry_manager.cpp +++ b/src/windows-emulator/registry/registry_manager.cpp @@ -105,7 +105,22 @@ std::optional registry_manager::get_key(const utils::path_key& key return {std::move(reg_key)}; } - const auto* entry = iterator->second->get_sub_key(reg_key.path.get()); + auto path = reg_key.path.get(); + const auto* entry = iterator->second->get_sub_key(path); + + if (!entry) + { + constexpr std::wstring_view wowPrefix = L"wow6432node\\"; + + const auto pathStr = path.wstring(); + if (pathStr.starts_with(wowPrefix)) + { + path = pathStr.substr(wowPrefix.size()); + reg_key.path = path; + entry = iterator->second->get_sub_key(path); + } + } + if (!entry) { return std::nullopt; diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index edc8e95b..ce138b95 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -259,6 +259,7 @@ namespace syscalls NTSTATUS handle_NtUnmapViewOfSection(const syscall_context& c, handle process_handle, uint64_t base_address); NTSTATUS handle_NtUnmapViewOfSectionEx(const syscall_context& c, handle process_handle, uint64_t base_address, ULONG /*flags*/); + NTSTATUS handle_NtAreMappedFilesTheSame(); // syscalls/semaphore.cpp: NTSTATUS handle_NtOpenSemaphore(const syscall_context& c, emulator_object semaphore_handle, @@ -866,6 +867,7 @@ void syscall_dispatcher::add_handlers(std::map& ha add_handler(NtFsControlFile); add_handler(NtQueryFullAttributesFile); add_handler(NtFlushBuffersFile); + add_handler(NtAreMappedFilesTheSame); add_handler(NtUserGetProcessWindowStation); add_handler(NtUserRegisterClassExWOW); add_handler(NtUserUnregisterClass); diff --git a/src/windows-emulator/syscalls/port.cpp b/src/windows-emulator/syscalls/port.cpp index c557c15d..32b5c0e0 100644 --- a/src/windows-emulator/syscalls/port.cpp +++ b/src/windows-emulator/syscalls/port.cpp @@ -4,18 +4,6 @@ namespace syscalls { - struct CSR_API_CONNECTINFO - { - uint64_t SharedSectionBase; - uint64_t SharedStaticServerData; - uint64_t SharedSectionHeap; - ULONG DebugFlags; - ULONG SizeOfPebData; - ULONG SizeOfTebData; - ULONG NumberOfServerDllNames; - EMULATOR_CAST(uint64_t, HANDLE) ServerProcessId; - }; - NTSTATUS handle_NtConnectPort(const syscall_context& c, const emulator_object client_port_handle, const emulator_object>> server_port_name, const emulator_object /*security_qos*/, @@ -33,34 +21,9 @@ namespace syscalls if (connection_info) { - if (p.name == u"\\Windows\\ApiPort") - { - CSR_API_CONNECTINFO connect_info{}; - - const auto expected_connect_length = connection_info_length.read(); - if (expected_connect_length < sizeof(CSR_API_CONNECTINFO)) - { - return STATUS_BUFFER_TOO_SMALL; - } - - // TODO: Use client_shared_memory to get the section entry and get the address from it? - connect_info.SharedSectionBase = c.proc.shared_section_address; - c.emu.write_memory(c.proc.shared_section_address + 2504, - 0xFFFFFFFF); // BaseStaticServerData->TermsrvClientTimeZoneId - - const auto static_server_data = - c.win_emu.memory.allocate_memory(0x10000, memory_permission::read_write); - connect_info.SharedStaticServerData = static_server_data; - c.emu.write_memory(static_server_data + 8, connect_info.SharedSectionBase); - - c.emu.write_memory(connection_info, &connect_info, sizeof(connect_info)); - } - else - { - std::vector zero_mem{}; - zero_mem.resize(connection_info_length.read(), 0); - c.emu.write_memory(connection_info, zero_mem.data(), zero_mem.size()); - } + std::vector zero_mem{}; + zero_mem.resize(connection_info_length.read(), 0); + c.emu.write_memory(connection_info, zero_mem.data(), zero_mem.size()); } client_shared_memory.access([&](PORT_VIEW64& view) { diff --git a/src/windows-emulator/syscalls/process.cpp b/src/windows-emulator/syscalls/process.cpp index dc648a8d..7b000840 100644 --- a/src/windows-emulator/syscalls/process.cpp +++ b/src/windows-emulator/syscalls/process.cpp @@ -309,6 +309,11 @@ namespace syscalls const auto tls_vector = teb.ThreadLocalStoragePointer; constexpr auto ptr_size = sizeof(EmulatorTraits::PVOID); + if (!tls_vector) + { + return; + } + if (tls_info.TlsRequest == ProcessTlsReplaceIndex) { const auto tls_entry_ptr = tls_vector + (tls_info.TlsIndex * ptr_size); diff --git a/src/windows-emulator/syscalls/registry.cpp b/src/windows-emulator/syscalls/registry.cpp index f27190b6..724d284a 100644 --- a/src/windows-emulator/syscalls/registry.cpp +++ b/src/windows-emulator/syscalls/registry.cpp @@ -239,7 +239,7 @@ namespace syscalls NTSTATUS handle_NtSetInformationKey() { - return STATUS_NOT_SUPPORTED; + return STATUS_SUCCESS; } NTSTATUS handle_NtEnumerateKey(const syscall_context& c, const handle key_handle, const ULONG index, diff --git a/src/windows-emulator/syscalls/section.cpp b/src/windows-emulator/syscalls/section.cpp index eb7b837a..d15e770a 100644 --- a/src/windows-emulator/syscalls/section.cpp +++ b/src/windows-emulator/syscalls/section.cpp @@ -143,6 +143,7 @@ namespace syscalls constexpr auto windows_dir_offset = 0x10; c.emu.write_memory(address + 8, windows_dir_offset); + // aka. BaseStaticServerData (BASE_STATIC_SERVER_DATA) const auto obj_address = address + windows_dir_offset; const emulator_object>> windir_obj{c.emu, obj_address}; @@ -168,6 +169,8 @@ namespace syscalls ucs.Buffer = ucs.Buffer - obj_address; }); + c.emu.write_memory(obj_address + 0x9C8, 0xFFFFFFFF); // TIME_ZONE_ID_INVALID + if (view_size) { view_size.write(shared_section_size); @@ -304,4 +307,9 @@ namespace syscalls { return handle_NtUnmapViewOfSection(c, process_handle, base_address); } + + NTSTATUS handle_NtAreMappedFilesTheSame() + { + return STATUS_NOT_SUPPORTED; + } }