46、Windows驱动程序模型笔记(四),异常

简介: 1、Summary of Kernel-Mode Support Routines http://msdn.microsoft.com/en-us/library/ff563889%28VS.85%29.aspx 决不在内核模式服务函数的参数中使用带有侧效的表达式。

1、Summary of Kernel-Mode Support Routines<?xml:namespace prefix = o />

http://msdn.microsoft.com/en-us/library/ff563889%28VS.85%29.aspx

决不在内核模式服务函数的参数中使用带有侧效的表达式。

2、异常

    对用户模式虚拟内存直接引用的代码段应该用结构化异常帧保护起来。这样的引用通常发生在调用MmProbeAndLockPages、ProbeForRead,和ProbeForWrite函数时。

    当异常发生时,操作系统通过扫描堆栈异常帧来寻找相应的异常处理程序。

wps_clip_image-1409

图示 结构化异常处理逻辑

    显示了对过滤函数的两次调用。一次为了定位异常处理程序,另一次为了回卷堆栈。

    如果你需要获得更多的关于异常的信息,有两个函数可以在__except的求值表达式中调用,它们可以提供本次异常的相关信息。实际上,这两个函数是在Microsoft编译器的内部实现的,所以仅能用于特定时刻:

•GetExceptionCode() 返回当前异常的数值代码。该值是一个NTSTATUS值。该函数仅在__except表达式和其后的异常处理代码中有效。

•GetExceptionInformation() 返回EXCEPTION_POINTERS结构的地址,该结构包含异常的所有详细信息,在哪发生、发生时寄存器的内容,等等。该函数仅在__except表达式中有效。

生成异常

仅当你知道存在一个异常处理代码并知道你真正在做什么时,才可以在非任意线程上下文下生成一个异常。

RaiseException

ExRaiseStatus

ExRaiseAccessViolation

ExRaiseDatatypeMisalignment

    有一个地方必须使用结构化异常处理机制,那就是当调用MmProbeAndLockPages函数锁定被MDL(内存描述符表)使用的内存页时,必须建立一个异常处理例程。对于WDM驱动程序,这个问题不经常出现,因为通常你使用的MDL都已经被其它程序探测并锁定(probe-and-lock)过。但是,由于你可以定义使用METHOD_NEITHER缓冲方法的I/O控制(IOCTL)操作,所以你必须按下面方式写代码:

PMDL mdl = MmCreateMdl(...);

__try

{

MmProbeAndLockPages(mdl, ...);

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

NTSTATUS status = GetExceptionCode();

ExFreePool((PVOID) mdl);

return CompleteRequest(Irp, status, 0);

}

    程序可以在任何IRQL上调用KeBugCheckEx。如果程序发现一个不可恢复的错误,并且该程序继续运行将会破坏系统,那么该程序就调用KeBugCheckEx函数,这个函数将使系统以一种可控制的方式关闭。

目录
相关文章
|
4月前
|
消息中间件 编译器 API
Windows窗口程序
Windows窗口程序
|
9天前
|
Linux Windows Python
最新 Windows\Linux 后台运行程序注解
本文介绍了在Windows和Linux系统后台运行程序的方法,包括Linux系统中使用nohup命令和ps命令查看进程,以及Windows系统中通过编写bat文件和使用PowerShell启动隐藏窗口的程序,确保即使退出命令行界面程序也继续在后台运行。
|
2月前
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
70 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
4月前
|
编译器 C语言 C++
|
26天前
|
存储 编译器 Linux
Windows 32 汇编笔记(二):使用 MASM
Windows 32 汇编笔记(二):使用 MASM
|
2月前
|
存储 安全 数据安全/隐私保护
Windows 32 汇编笔记(一):基础知识
Windows 32 汇编笔记(一):基础知识
|
3月前
|
编解码 Windows
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
XviD是开源MPEG-4视频编码器,与DivX相似但后者非开源。早期MP4常使用XviD或DivX编码,现已被H.264取代。在Windows上集成FFmpeg的XviD编解码库libxvid,需访问<https://labs.xvid.com/source/>下载源码,解压后在MSYS环境中配置、编译和安装。之后重新配置FFmpeg,启用libxvid并编译安装。详细步骤包括configure命令、make和make install。成功后,通过`ffmpeg -version`检查是否启用libxvid。更多音视频开发技术可参考《FFmpeg开发实战:从零基础到短视频上线》。
83 0
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
|
2月前
|
安全 网络协议 Linux
【Windows】已解决:修改本地host文件异常的正确解决方法
【Windows】已解决:修改本地host文件异常的正确解决方法
96 0
|
4月前
|
Windows
LabVIEW启用/禁用Windows屏幕保护程序
LabVIEW启用/禁用Windows屏幕保护程序
51 4
LabVIEW启用/禁用Windows屏幕保护程序
|
3月前
|
Windows
windows系统bat批处理 开机一键多个程序
windows系统bat批处理 开机一键多个程序
34 1
下一篇
DDNS