diff --git a/src/emulator/syscalls.cpp b/src/emulator/syscalls.cpp index 5a8e4f6c..f08c7f0f 100644 --- a/src/emulator/syscalls.cpp +++ b/src/emulator/syscalls.cpp @@ -138,13 +138,39 @@ namespace const unicorn_object return_length{uc, uc.reg(UC_X86_REG_R9)}; if (info_class == SystemFlushInformation - || info_class == SystemNumaProcessorMap || info_class == SystemHypervisorSharedPageInformation) { uc.reg(UC_X86_REG_RAX, STATUS_NOT_SUPPORTED); return; } + if (info_class == SystemNumaProcessorMap) + { + if (return_length) + { + return_length.write(sizeof(SYSTEM_NUMA_INFORMATION)); + } + + if (system_information_length != sizeof(SYSTEM_NUMA_INFORMATION)) + { + uc.reg(UC_X86_REG_RAX, STATUS_BUFFER_TOO_SMALL); + return; + } + + const unicorn_object info_obj{uc, system_information}; + + info_obj.access([&](SYSTEM_NUMA_INFORMATION& info) + { + memset(&info, 0, sizeof(info)); + info.ActiveProcessorsGroupAffinity->Mask = 0xFFF; + info.AvailableMemory[0] = 0xFFF; + info.Pad[0] = 0xFFF; + }); + + uc.reg(UC_X86_REG_RAX, STATUS_SUCCESS); + return; + } + if (info_class != SystemBasicInformation && info_class != SystemEmulationBasicInformation) { printf("Unsupported system info class: %X\n", info_class); @@ -159,7 +185,7 @@ namespace if (system_information_length != sizeof(SYSTEM_BASIC_INFORMATION)) { - uc.reg(UC_X86_REG_RAX, STATUS_BUFFER_OVERFLOW); + uc.reg(UC_X86_REG_RAX, STATUS_BUFFER_TOO_SMALL); return; } @@ -211,7 +237,7 @@ namespace if (system_information_length != sizeof(SYSTEM_BASIC_INFORMATION)) { - uc.reg(UC_X86_REG_RAX, STATUS_BUFFER_OVERFLOW); + uc.reg(UC_X86_REG_RAX, STATUS_BUFFER_TOO_SMALL); return; }