windows 如何在驱动程序中显示弹出消息框(内核模式)?

bn31dyow  于 12个月前  发布在  Windows
关注(0)|答案(3)|浏览(247)

我正在写一个驱动程序,它需要立即弹出一个对话框来通知用户一个事件。
(Kind类似于Windows的 “Corrupt file” 通知,但这不是与文件系统相关的驱动程序。)
我知道ExRaiseHardErrorIoRaiseInformationalHardError应该能够做到这一点,但它们似乎不起作用--它们“成功地”返回,而实际上没有做任何事情。
我该怎么做(不创建用户模式程序)?
下面是一个
用户模式**版本的代码(它 * 工作正常 *)。
在内核模式版本中,我调用ExRaiseHardError而不是NtRaiseHardError,但方式完全相同。

#include <windows.h>

#pragma comment(lib, "ntdll.lib")    // Needs ntdll.lib from Windows Driver Kit

typedef enum HardErrorResponseType {
    ResponseTypeAbortRetryIgnore,
    ResponseTypeOK,
    ResponseTypeOKCancel,
    ResponseTypeRetryCancel,
    ResponseTypeYesNo,
    ResponseTypeYesNoCancel,
    ResponseTypeShutdownSystem,
    ResponseTypeTrayNotify,
    ResponseTypeCancelTryAgainContinue
} HardErrorResponseType;

typedef enum HardErrorResponse {
    ResponseReturnToCaller,
    ResponseNotHandled,
    ResponseAbort, ResponseCancel,
    ResponseIgnore,
    ResponseNo,
    ResponseOk,
    ResponseRetry,
    ResponseYes
} HardErrorResponse;

typedef enum HardErrorResponseButton {
    ResponseButtonOK,
    ResponseButtonOKCancel,
    ResponseButtonAbortRetryIgnore,
    ResponseButtonYesNoCancel,
    ResponseButtonYesNo,
    ResponseButtonRetryCancel,
    ResponseButtonCancelTryAgainContinue
} HardErrorResponseButton;

typedef enum HardErrorResponseDefaultButton {
    DefaultButton1 = 0,
    DefaultButton2 = 0x100,
    DefaultButton3 = 0x200
} HardErrorResponseDefaultButton;

typedef enum HardErrorResponseIcon {
    IconAsterisk = 0x40,
    IconError = 0x10,
    IconExclamation = 0x30,
    IconHand = 0x10,
    IconInformation = 0x40,
    IconNone = 0,
    IconQuestion = 0x20,
    IconStop = 0x10,
    IconWarning = 0x30,
    IconUserIcon = 0x80
} HardErrorResponseIcon;

typedef enum HardErrorResponseOptions {
    ResponseOptionNone = 0,
    ResponseOptionDefaultDesktopOnly = 0x20000,
    ResponseOptionHelp = 0x4000,
    ResponseOptionRightAlign = 0x80000,
    ResponseOptionRightToLeftReading = 0x100000,
    ResponseOptionTopMost = 0x40000,
    ResponseOptionServiceNotification = 0x00200000,
    ResponseOptionServiceNotificationNT3X = 0x00040000,
    ResponseOptionSetForeground = 0x10000,
    ResponseOptionSystemModal = 0x1000,
    ResponseOptionTaskModal = 0x2000,
    ResponseOptionNoFocus = 0x00008000
} HardErrorResponseOptions;

typedef LONG NTSTATUS;

typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

EXTERN_C DECLSPEC_IMPORT NTSTATUS NTAPI NtRaiseHardError(
    IN NTSTATUS ErrorStatus, IN ULONG NumberOfParameters,
    IN ULONG UnicodeStringParameterMask, IN PULONG_PTR Parameters,
    IN ULONG ValidResponseOptions,
    OUT HardErrorResponse *Response);

EXTERN_C DECLSPEC_IMPORT VOID NTAPI RtlInitUnicodeString(
    IN OUT PUNICODE_STRING DestinationString, IN PCWSTR SourceString);

#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
#define STATUS_SERVICE_NOTIFICATION ((NTSTATUS)0x50000018L)

int main(void)
{
    HardErrorResponse r;

    // To display a standard NTSTATUS value:
    NtRaiseHardError(STATUS_ACCESS_DENIED, 0, 0, NULL, ResponseTypeOK, &r);

    // To display a custom string:
    UNICODE_STRING wTitle, wText;
    RtlInitUnicodeString(&wTitle, L"Title");
    RtlInitUnicodeString(&wText, L"Text");
    ULONG_PTR params[4] = {
        (ULONG_PTR)&wText,
        (ULONG_PTR)&wTitle,
        (
            (ULONG)ResponseButtonOK   |
            (ULONG)IconInformation    |
            (ULONG)ResponseOptionNone |
            (ULONG)DefaultButton1
        ),
        INFINITE
    };
    NtRaiseHardError(STATUS_SERVICE_NOTIFICATION, 4, 0x3, params, 0, &r);

    return 0;
}

字符串

b4lqfgs4

b4lqfgs41#

内核驱动不能显示MessageBox。如果你想这样做,那么你必须通过一个用户态应用程序提供一个与内核驱动的通信功能,然后从你的用户态应用程序显示MessageBox。
所有关于[Zw/Nt]RaiseHardError的讨论都是无关紧要的。如果你拆解MessageBox,你会注意到这个API最终会被调用。

ws51t4hk

ws51t4hk2#

我不认为没有一个应用程序(或服务)在用户模式下运行,你可以加载一个驱动程序在内存中(即使它将是一个过滤器驱动程序)。

hzbexzde

hzbexzde3#

这完全可以从你的内核代码中实现,但只能使用Map的驱动程序。
https://vollragm.github.io/posts/kernel-message-box/

extern "C" NTSTATUS NTAPI ExRaiseHardError(
    NTSTATUS ErrorStatus, ULONG NumberOfParameters, 
    ULONG UnicodeStringParameterMask, PULONG_PTR Parameters,
    ULONG ValidResponseOptions, PULONG Response);

ULONG KeMessageBox(PCWSTR title, PCWSTR text, ULONG_PTR type)
{
    UNICODE_STRING uTitle = { 0 };
    UNICODE_STRING uText = { 0 };

    RtlInitUnicodeString(&uTitle, title);
    RtlInitUnicodeString(&uText, text);

    ULONG_PTR args[] = { (ULONG_PTR)&uText, (ULONG_PTR)&uTitle, type };
    ULONG response = 0;

    ExRaiseHardError(STATUS_SERVICE_NOTIFICATION, 3, 3, args, 2, &response);
    return response;
}

字符串

相关问题