Вывод сообщения через ZwRaiseHardError, то работает, то нет

Тема в разделе "WASM.BEGINNERS", создана пользователем Flaer, 10 апр 2022.

  1. Flaer

    Flaer Member

    Публикаций:
    0
    Регистрация:
    10 дек 2019
    Сообщения:
    32
    В общем использую эту функцию в EXE, получаю нормальный результат, когда вызываю из DLL сообщение не выводится, в обоих случаях возвращается NTSUCCESS, отрабатывает функция нормально, единственная разница между вызовами, в EXE в Response возвращается - 6, а в DLL - 0
    Как результат в EXE сообщение выводится, а в DLL нет

    Код (C):
    1.  
    2. #include <windows.h>
    3. #include <winternl.h>
    4. #pragma comment(lib, "ntdll.lib")
    5. extern "C" NTSTATUS NTAPI ZwRaiseHardError(LONG ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask,
    6.     PULONG_PTR Parameters, ULONG ValidResponseOptions, PULONG Response);
    7. int main()
    8. {
    9.     UNICODE_STRING msgBody;
    10.     UNICODE_STRING msgCaption;
    11.     ULONG ErrorResponse;
    12.     RtlInitUnicodeString(&msgCaption, L"Message");
    13.     RtlInitUnicodeString(&msgBody,  L"Hello from kernel");
    14.     const ULONG_PTR msgParams[] = {
    15.         (ULONG_PTR)&msgBody,
    16.         (ULONG_PTR)&msgCaption,
    17.         (ULONG_PTR)(MB_OK | MB_ICONWARNING)
    18.     };
    19.     ZwRaiseHardError(0x50000018L, 0x0000003L, 3, (PULONG_PTR)msgParams, NULL, &ErrorResponse);
    20. }
    Как заставить ее стабильно выводить сообщение ?
    Для справки в DLL вызов происходит в DLLMain, сразу же как длл попадает в память
     
    Последнее редактирование модератором: 10 апр 2022
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.459
    Адрес:
    Россия, Нижний Новгород
    Так как DllMain вызывается под LoaderLock’ом, есть вероятность, что это мешает нормальному отображению сообщения.
    Посмотри, что ZwRaiseHardError делает внутри, нет ли там захвата Ldr-лока или проверки, что он захвачен, с последующим выходом без показа сообщения.
    Потому что больше нет разницы между вызовом в контексте обычной функции и вызовом в контексте DllMain.
    Можешь проверить, вызвав её в библиотеке, но не из DllMain’а - сообщение должно появиться.
     
  3. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Разве Native api не должны в случае успеха всегда возвращать 0 (status_success) ? У меня в ехе возвращает 0, в длл не пробовал
     
  4. Flaer

    Flaer Member

    Публикаций:
    0
    Регистрация:
    10 дек 2019
    Сообщения:
    32
    Ты немного не понял, респонсе это последний параметр в функции, ты спутал это с возвращаемым значением, там то все ок в обоих случаях 0
    Как я по итогу понял, код который отрабатывает в DLLMain каким-то чудным образом не может вызвать ХардЕррор что бы вывести сообщение, функция отрабатывает, все нормально, но сообщений нет, почитал про это, там какие-то приколы с csrss поэтому из DLLMian хардэррор не показывается