From 915b31c093fa241b556f87715416e43a8ed50665 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Fri, 11 Apr 2025 17:44:57 +0200 Subject: [PATCH] Cleanup system information syscalls --- src/windows-emulator/syscall_utils.hpp | 25 ++ src/windows-emulator/syscalls/system.cpp | 321 +++++++---------------- 2 files changed, 124 insertions(+), 222 deletions(-) diff --git a/src/windows-emulator/syscall_utils.hpp b/src/windows-emulator/syscall_utils.hpp index 32118839..d440aaec 100644 --- a/src/windows-emulator/syscall_utils.hpp +++ b/src/windows-emulator/syscall_utils.hpp @@ -193,3 +193,28 @@ void write_attribute(emulator& emu, const PS_ATTRIBUTE& attribute, const emulator_object{emu, attribute.Value}.write(value); } } + +template +NTSTATUS handle_query(x64_emulator& emu, const uint64_t buffer, const uint32_t length, + const emulator_object return_length, const Action& action) +{ + constexpr auto required_size = sizeof(ResponseType); + + if (return_length) + { + return_length.write(required_size); + } + + if (length < required_size) + { + return TooSmallResponse; + } + + const emulator_object obj{emu, buffer}; + obj.access([&](ResponseType& resp_obj) { + action(resp_obj); // + }); + + return SuccessResponse; +} diff --git a/src/windows-emulator/syscalls/system.cpp b/src/windows-emulator/syscalls/system.cpp index 426bc207..8eb40f4f 100644 --- a/src/windows-emulator/syscalls/system.cpp +++ b/src/windows-emulator/syscalls/system.cpp @@ -4,212 +4,86 @@ namespace syscalls { - NTSTATUS handle_NtQuerySystemInformation(const syscall_context& c, const uint32_t info_class, - const uint64_t system_information, - const uint32_t system_information_length, - const emulator_object return_length) - { - if (info_class == SystemFlushInformation || info_class == SystemHypervisorSharedPageInformation || - info_class == 250 // Build 27744 - ) - { - return STATUS_NOT_SUPPORTED; - } - - if (info_class == SystemTimeOfDayInformation) - { - if (return_length) - { - return_length.write(sizeof(SYSTEM_TIMEOFDAY_INFORMATION64)); - } - - if (system_information_length != sizeof(SYSTEM_TIMEOFDAY_INFORMATION64)) - { - return STATUS_BUFFER_TOO_SMALL; - } - - const emulator_object info_obj{c.emu, system_information}; - - info_obj.access([&](SYSTEM_TIMEOFDAY_INFORMATION64& info) { - info.BootTime.QuadPart = 0; - // TODO: Fill - }); - - return STATUS_SUCCESS; - } - - if (info_class == SystemRangeStartInformation) - { - if (return_length) - { - return_length.write(sizeof(SYSTEM_RANGE_START_INFORMATION64)); - } - - if (system_information_length != sizeof(SYSTEM_RANGE_START_INFORMATION64)) - { - return STATUS_BUFFER_TOO_SMALL; - } - - const emulator_object info_obj{c.emu, system_information}; - - info_obj.access([&](SYSTEM_RANGE_START_INFORMATION64& info) { - info.SystemRangeStart = 0xFFFF800000000000; // - }); - - return STATUS_SUCCESS; - } - - if (info_class == SystemProcessorInformation) - { - if (return_length) - { - return_length.write(sizeof(SYSTEM_PROCESSOR_INFORMATION64)); - } - - if (system_information_length != sizeof(SYSTEM_PROCESSOR_INFORMATION64)) - { - return STATUS_BUFFER_TOO_SMALL; - } - - const emulator_object info_obj{c.emu, system_information}; - - info_obj.access([&](SYSTEM_PROCESSOR_INFORMATION64& info) { - memset(&info, 0, sizeof(info)); - info.MaximumProcessors = 2; - info.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64; - }); - - return STATUS_SUCCESS; - } - - if (info_class == SystemNumaProcessorMap) - { - if (return_length) - { - return_length.write(sizeof(SYSTEM_NUMA_INFORMATION64)); - } - - if (system_information_length != sizeof(SYSTEM_NUMA_INFORMATION64)) - { - return STATUS_BUFFER_TOO_SMALL; - } - - const emulator_object info_obj{c.emu, system_information}; - - info_obj.access([&](SYSTEM_NUMA_INFORMATION64& info) { - memset(&info, 0, sizeof(info)); - info.ActiveProcessorsGroupAffinity->Mask = 0xFFF; - info.AvailableMemory[0] = 0xFFF; - info.Pad[0] = 0xFFF; - }); - - return STATUS_SUCCESS; - } - - if (info_class == SystemErrorPortTimeouts) - { - if (return_length) - { - return_length.write(sizeof(SYSTEM_ERROR_PORT_TIMEOUTS)); - } - - if (system_information_length != sizeof(SYSTEM_ERROR_PORT_TIMEOUTS)) - { - return STATUS_BUFFER_TOO_SMALL; - } - - const emulator_object info_obj{c.emu, system_information}; - - info_obj.access([&](SYSTEM_ERROR_PORT_TIMEOUTS& info) { - info.StartTimeout = 0; - info.CommTimeout = 0; - }); - - return STATUS_SUCCESS; - } - - if (info_class == SystemKernelDebuggerInformation) - { - if (return_length) - { - return_length.write(sizeof(SYSTEM_KERNEL_DEBUGGER_INFORMATION)); - } - - if (system_information_length != sizeof(SYSTEM_KERNEL_DEBUGGER_INFORMATION)) - { - return STATUS_BUFFER_TOO_SMALL; - } - - const emulator_object info_obj{c.emu, system_information}; - - info_obj.access([&](SYSTEM_KERNEL_DEBUGGER_INFORMATION& info) { - info.KernelDebuggerEnabled = FALSE; - info.KernelDebuggerNotPresent = TRUE; - }); - - return STATUS_SUCCESS; - } - - if (info_class == SystemControlFlowTransition) - { - c.win_emu.log.print(color::pink, "Warbird control flow transition!\n"); - return STATUS_NOT_SUPPORTED; - } - - if (info_class == SystemProcessInformation || info_class == SystemModuleInformation || - info_class == SystemMemoryUsageInformation || info_class == SystemCodeIntegrityPolicyInformation) - { - return STATUS_NOT_SUPPORTED; - } - - if (info_class != SystemBasicInformation && info_class != SystemEmulationBasicInformation) - { - c.win_emu.log.error("Unsupported system info class: %X\n", info_class); - c.emu.stop(); - return STATUS_NOT_SUPPORTED; - } - - if (return_length) - { - return_length.write(sizeof(SYSTEM_BASIC_INFORMATION64)); - } - - if (system_information_length != sizeof(SYSTEM_BASIC_INFORMATION64)) - { - return STATUS_BUFFER_TOO_SMALL; - } - - const emulator_object info{c.emu, system_information}; - - info.access([&](SYSTEM_BASIC_INFORMATION64& basic_info) { - basic_info.Reserved = 0; - basic_info.TimerResolution = 0x0002625a; - basic_info.PageSize = 0x1000; - basic_info.LowestPhysicalPageNumber = 0x00000001; - basic_info.HighestPhysicalPageNumber = 0x00c9c7ff; - basic_info.AllocationGranularity = ALLOCATION_GRANULARITY; - basic_info.MinimumUserModeAddress = MIN_ALLOCATION_ADDRESS; - basic_info.MaximumUserModeAddress = MAX_ALLOCATION_ADDRESS; - basic_info.ActiveProcessorsAffinityMask = 0x0000000000000fff; - basic_info.NumberOfProcessors = 1; - }); - - return STATUS_SUCCESS; - } - NTSTATUS handle_NtQuerySystemInformationEx(const syscall_context& c, const uint32_t info_class, const uint64_t input_buffer, const uint32_t input_buffer_length, const uint64_t system_information, const uint32_t system_information_length, const emulator_object return_length) { - if (info_class == SystemFlushInformation || info_class == SystemFeatureConfigurationInformation || - info_class == SystemSupportedProcessorArchitectures2 || - info_class == SystemFeatureConfigurationSectionInformation) + if (info_class == SystemFlushInformation // + || info_class == SystemHypervisorSharedPageInformation // + || info_class == 250 // Build 27744 + || info_class == SystemProcessInformation // + || info_class == SystemModuleInformation // + || info_class == SystemMemoryUsageInformation // + || info_class == SystemCodeIntegrityPolicyInformation // + || info_class == SystemFeatureConfigurationInformation // + || info_class == SystemSupportedProcessorArchitectures2 // + || info_class == SystemFeatureConfigurationSectionInformation) { return STATUS_NOT_SUPPORTED; } + if (info_class == SystemTimeOfDayInformation) + { + return handle_query(c.emu, system_information, system_information_length, + return_length, + [&](SYSTEM_TIMEOFDAY_INFORMATION64& info) { + info.BootTime.QuadPart = 0; + // TODO: Fill + }); + } + + if (info_class == SystemRangeStartInformation) + { + return handle_query(c.emu, system_information, system_information_length, + return_length, + [&](SYSTEM_RANGE_START_INFORMATION64& info) { + info.SystemRangeStart = 0xFFFF800000000000; // + }); + } + + if (info_class == SystemProcessorInformation) + { + return handle_query( + c.emu, system_information, system_information_length, return_length, + [&](SYSTEM_PROCESSOR_INFORMATION64& info) { + memset(&info, 0, sizeof(info)); + info.MaximumProcessors = 2; + info.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64; + }); + } + + if (info_class == SystemNumaProcessorMap) + { + return handle_query(c.emu, system_information, system_information_length, + return_length, [&](SYSTEM_NUMA_INFORMATION64& info) { + memset(&info, 0, sizeof(info)); + info.ActiveProcessorsGroupAffinity->Mask = 0xFFF; + info.AvailableMemory[0] = 0xFFF; + info.Pad[0] = 0xFFF; + }); + } + + if (info_class == SystemErrorPortTimeouts) + { + return handle_query(c.emu, system_information, system_information_length, + return_length, [&](SYSTEM_ERROR_PORT_TIMEOUTS& info) { + info.StartTimeout = 0; + info.CommTimeout = 0; + }); + } + + if (info_class == SystemKernelDebuggerInformation) + { + return handle_query(c.emu, system_information, + system_information_length, return_length, + [&](SYSTEM_KERNEL_DEBUGGER_INFORMATION& info) { + info.KernelDebuggerEnabled = FALSE; + info.KernelDebuggerNotPresent = TRUE; + }); + } + if (info_class == SystemLogicalProcessorInformation) { if (input_buffer_length != sizeof(USHORT)) @@ -322,43 +196,46 @@ namespace syscalls return STATUS_NOT_SUPPORTED; } - if (info_class != SystemBasicInformation && info_class != SystemEmulationBasicInformation) + if (info_class == SystemControlFlowTransition) { - c.win_emu.log.error("Unsupported system info ex class: %X\n", info_class); - c.emu.stop(); + c.win_emu.log.print(color::pink, "Warbird control flow transition!\n"); return STATUS_NOT_SUPPORTED; } - if (return_length) + if (info_class == SystemBasicInformation || info_class == SystemEmulationBasicInformation) { - return_length.write(sizeof(SYSTEM_BASIC_INFORMATION64)); + return handle_query( + c.emu, system_information, system_information_length, return_length, + [&](SYSTEM_BASIC_INFORMATION64& basic_info) { + basic_info.Reserved = 0; + basic_info.TimerResolution = 0x0002625a; + basic_info.PageSize = 0x1000; + basic_info.LowestPhysicalPageNumber = 0x00000001; + basic_info.HighestPhysicalPageNumber = 0x00c9c7ff; + basic_info.AllocationGranularity = ALLOCATION_GRANULARITY; + basic_info.MinimumUserModeAddress = MIN_ALLOCATION_ADDRESS; + basic_info.MaximumUserModeAddress = MAX_ALLOCATION_ADDRESS; + basic_info.ActiveProcessorsAffinityMask = 0x0000000000000fff; + basic_info.NumberOfProcessors = 1; + }); } - if (system_information_length < sizeof(SYSTEM_BASIC_INFORMATION64)) - { - return STATUS_INFO_LENGTH_MISMATCH; - } + c.win_emu.log.error("Unsupported system info class: %X\n", info_class); + c.emu.stop(); + return STATUS_NOT_SUPPORTED; + } - const emulator_object info{c.emu, system_information}; - - info.access([&](SYSTEM_BASIC_INFORMATION64& basic_info) { - basic_info.Reserved = 0; - basic_info.TimerResolution = 0x0002625a; - basic_info.PageSize = 0x1000; - basic_info.LowestPhysicalPageNumber = 0x00000001; - basic_info.HighestPhysicalPageNumber = 0x00c9c7ff; - basic_info.AllocationGranularity = ALLOCATION_GRANULARITY; - basic_info.MinimumUserModeAddress = MIN_ALLOCATION_ADDRESS; - basic_info.MaximumUserModeAddress = MAX_ALLOCATION_ADDRESS; - basic_info.ActiveProcessorsAffinityMask = 0x0000000000000fff; - basic_info.NumberOfProcessors = 1; - }); - - return STATUS_SUCCESS; + NTSTATUS handle_NtQuerySystemInformation(const syscall_context& c, const uint32_t info_class, + const uint64_t system_information, + const uint32_t system_information_length, + const emulator_object return_length) + { + return handle_NtQuerySystemInformationEx(c, info_class, 0, 0, system_information, system_information_length, + return_length); } NTSTATUS handle_NtSetSystemInformation() { return STATUS_NOT_SUPPORTED; } -} \ No newline at end of file +}