(类似于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出消息框(内核模式)?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)