From c3e642c89aece720b320f19bd4759792fd068e38 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Wed, 28 Aug 2024 19:32:51 +0200 Subject: [PATCH] Prepare new syscalls --- src/windows_emulator/process_context.hpp | 1 + src/windows_emulator/syscalls.cpp | 36 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/windows_emulator/process_context.hpp b/src/windows_emulator/process_context.hpp index 434dac31..9689d51c 100644 --- a/src/windows_emulator/process_context.hpp +++ b/src/windows_emulator/process_context.hpp @@ -48,5 +48,6 @@ struct process_context std::map events{}; std::map os_handles{}; + std::map sections{}; emulator_allocator gs_segment{}; }; diff --git a/src/windows_emulator/syscalls.cpp b/src/windows_emulator/syscalls.cpp index 771d1da2..3ee4f11a 100644 --- a/src/windows_emulator/syscalls.cpp +++ b/src/windows_emulator/syscalls.cpp @@ -13,6 +13,7 @@ namespace constexpr uint64_t EVENT_BIT = 1ULL << 62ULL; constexpr uint64_t DIRECTORY_BIT = 1ULL << 61ULL; constexpr uint64_t SYMLINK_BIT = 1ULL << 60ULL; + constexpr uint64_t SECTION_BIT = 1ULL << 59ULL; constexpr uint64_t KNOWN_DLLS_DIRECTORY = DIRECTORY_BIT | PSEUDO_BIT | 0x1337; constexpr uint64_t KNOWN_DLLS_SYMLINK = SYMLINK_BIT | PSEUDO_BIT | 0x1337; @@ -328,6 +329,39 @@ namespace return STATUS_SUCCESS; } + NTSTATUS handle_NtOpenSection(const syscall_context& c, const emulator_object section_handle, + const ACCESS_MASK /*desired_access*/, + const emulator_object object_attributes) + { + uint32_t index = 1; + for (;; ++index) + { + if (!c.proc.sections.contains(index)) + { + break; + } + } + + section_handle.write(index | SECTION_BIT); + + object_attributes.access([&](const OBJECT_ATTRIBUTES& attributes) + { + auto section = read_unicode_string(c.emu, attributes.ObjectName); + c.proc.sections.try_emplace(index, std::move(section)); + }); + + return STATUS_SUCCESS; + } + + NTSTATUS handle_NtMapViewOfSection(const syscall_context& c, uint64_t section_handle, uint64_t process_handle, + emulator_object base_address, ULONG_PTR zero_bits, SIZE_T commit_size, + const emulator_object section_offset, + const emulator_object view_size, SECTION_INHERIT inherit_disposition, + ULONG allocation_type, ULONG win32_protect) + { + const auto desired_base = base_address.read(); + return STATUS_SUCCESS; + } NTSTATUS handle_NtCreateIoCompletion(const syscall_context& c, const emulator_object event_handle, const ACCESS_MASK desired_access, const uint64_t object_attributes, @@ -814,6 +848,8 @@ syscall_dispatcher::syscall_dispatcher(const exported_symbols& ntdll_exports) add_handler(NtCreateWaitCompletionPacket); add_handler(NtCreateWorkerFactory); add_handler(NtManageHotPatch); + add_handler(NtOpenSection); + add_handler(NtMapViewOfSection); add_handler(NtOpenSymbolicLinkObject); add_handler(NtQuerySymbolicLinkObject); add_handler(NtQuerySystemInformationEx);