c – 如何从驱动程序显示d出消息框(内核模式)?

c – 如何从驱动程序显示d出消息框(内核模式)?,第1张

概述我正在编写一个驱动程序,需要立即d出一个对话框来通知用户一个事件. (类似于NTFS的“损坏文件”通知,除了这不是与文件系统相关的驱动程序.) 我知道ExRaiseHardError和IoRaiseInformationalHardError应该可以做到这一点,但它们似乎不起作用 – 它们“成功”返回而不实际做任何事情. 我该怎么做(没有创建用户模式程序)? 代码的用户模式版本(可正常工作)如下所 我正在编写一个驱动程序,需要立即d出一个对话框来通知用户一个事件.
(类似于NTFS的“损坏文件”通知,除了这不是与文件系统相关的驱动程序.)

我知道ExRaiseHardError和IoRaiseinformationalHardError应该可以做到这一点,但它们似乎不起作用 – 它们“成功”返回而不实际做任何事情.

我该怎么做(没有创建用户模式程序)?

代码的用户模式版本(可正常工作)如下所示.

内核模式版本中,我调用ExRaiseHardError而不是NtRaiseHardError,但方式完全相同.

#include <windows.h>#pragma comment(lib,"ntdll.lib")    // Needs ntdll.lib from windows Driver Kittypedef 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,NulL,&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,&r);    return 0;}
解决方法@H_419_24@ 内核驱动程序无法显示MessageBox.如果您想这样做,那么您必须通过内核驱动程序通过用户登陆应用程序提供通信功能,然后从您的用户登陆应用程序中显示MessageBox.

所有关于[Zw / Nt] RaiseHardError的讨论都是无关紧要的.如果您反汇编MessageBox,您会注意到最终会调用此API.

总结

以上是内存溢出为你收集整理的c – 如何从驱动程序显示d出消息框(内核模式)?全部内容,希望文章能够帮你解决c – 如何从驱动程序显示d出消息框(内核模式)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225890.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存