diff --git a/src/common/platform/status.hpp b/src/common/platform/status.hpp index 042d9754..23b55e7a 100644 --- a/src/common/platform/status.hpp +++ b/src/common/platform/status.hpp @@ -68,5 +68,7 @@ using NTSTATUS = std::uint32_t; #define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005L) +#define STATUS_SERVICE_NOTIFICATION ((NTSTATUS)0x40000018L) + #define FILE_DEVICE_NETWORK 0x00000012 #define FSCTL_AFD_BASE FILE_DEVICE_NETWORK diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 15cd7d67..311ec6e9 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -27,7 +27,7 @@ namespace syscalls // syscalls/exception.cpp NTSTATUS handle_NtRaiseHardError(const syscall_context& c, NTSTATUS error_status, ULONG number_of_parameters, emulator_object>> unicode_string_parameter_mask, - emulator_object parameters, HARDERROR_RESPONSE_OPTION valid_response_option, + uint64_t parameters, HARDERROR_RESPONSE_OPTION valid_response_option, emulator_object response); NTSTATUS handle_NtRaiseException(const syscall_context& c, emulator_object>> exception_record, diff --git a/src/windows-emulator/syscalls/exception.cpp b/src/windows-emulator/syscalls/exception.cpp index b18edbf0..fab2d2ee 100644 --- a/src/windows-emulator/syscalls/exception.cpp +++ b/src/windows-emulator/syscalls/exception.cpp @@ -4,10 +4,10 @@ namespace syscalls { - NTSTATUS handle_NtRaiseHardError(const syscall_context& c, const NTSTATUS error_status, const ULONG /*number_of_parameters*/, + NTSTATUS handle_NtRaiseHardError(const syscall_context& c, const NTSTATUS error_status, const ULONG number_of_parameters, const emulator_object>> - /*unicode_string_parameter_mask*/, - const emulator_object /*parameters*/, const HARDERROR_RESPONSE_OPTION /*valid_response_option*/, + /*unicode_string_parameter_mask*/, + const uint64_t parameters, const HARDERROR_RESPONSE_OPTION /*valid_response_option*/, const emulator_object response) { if (response) @@ -15,6 +15,18 @@ namespace syscalls response.write(ResponseAbort); } + if (error_status & STATUS_SERVICE_NOTIFICATION && number_of_parameters >= 3) + { + ULONG_PTR params[3] = {0, 0, 0}; + + if (c.emu.try_read_memory(parameters, ¶ms, sizeof(params))) + { + std::u16string message = + read_unicode_string(c.emu, emulator_object>>{c.emu, params[0]}); + c.win_emu.log.error("Error Message: %s\n", u16_to_u8(message).c_str()); + } + } + c.proc.exit_status = error_status; c.win_emu.callbacks.on_exception(); c.emu.stop();