В общем использую эту функцию в EXE, получаю нормальный результат, когда вызываю из DLL сообщение не выводится, в обоих случаях возвращается NTSUCCESS, отрабатывает функция нормально, единственная разница между вызовами, в EXE в Response возвращается - 6, а в DLL - 0 Как результат в EXE сообщение выводится, а в DLL нет Код (C): #include <windows.h> #include <winternl.h> #pragma comment(lib, "ntdll.lib") extern "C" NTSTATUS NTAPI ZwRaiseHardError(LONG ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask, PULONG_PTR Parameters, ULONG ValidResponseOptions, PULONG Response); int main() { UNICODE_STRING msgBody; UNICODE_STRING msgCaption; ULONG ErrorResponse; RtlInitUnicodeString(&msgCaption, L"Message"); RtlInitUnicodeString(&msgBody, L"Hello from kernel"); const ULONG_PTR msgParams[] = { (ULONG_PTR)&msgBody, (ULONG_PTR)&msgCaption, (ULONG_PTR)(MB_OK | MB_ICONWARNING) }; ZwRaiseHardError(0x50000018L, 0x0000003L, 3, (PULONG_PTR)msgParams, NULL, &ErrorResponse); } Как заставить ее стабильно выводить сообщение ? Для справки в DLL вызов происходит в DLLMain, сразу же как длл попадает в память
Так как DllMain вызывается под LoaderLock’ом, есть вероятность, что это мешает нормальному отображению сообщения. Посмотри, что ZwRaiseHardError делает внутри, нет ли там захвата Ldr-лока или проверки, что он захвачен, с последующим выходом без показа сообщения. Потому что больше нет разницы между вызовом в контексте обычной функции и вызовом в контексте DllMain. Можешь проверить, вызвав её в библиотеке, но не из DllMain’а - сообщение должно появиться.
Разве Native api не должны в случае успеха всегда возвращать 0 (status_success) ? У меня в ехе возвращает 0, в длл не пробовал
Ты немного не понял, респонсе это последний параметр в функции, ты спутал это с возвращаемым значением, там то все ок в обоих случаях 0 Как я по итогу понял, код который отрабатывает в DLLMain каким-то чудным образом не может вызвать ХардЕррор что бы вывести сообщение, функция отрабатывает, все нормально, но сообщений нет, почитал про это, там какие-то приколы с csrss поэтому из DLLMian хардэррор не показывается