分类: WINDOWS
2011-03-08 14:54:11
如果某段内存是只读的,而驱动程序试图去写操作,会导致系统的崩溃。同样某段内存是不可读的情况下,驱动程序试图去读,也会导致系统的崩溃
DDK提供下面的两个函数来判断某段内存是否可读写
VOID ProbeForRead/Write(
IN CONST VOID*Address,//要被检查的内存的地址
IN SIZE_T Length,//要被检查的内存的长度,单位是字节
IN ULONG Alignment//描述该段内存是以多少字节对齐的
)
这两个函数不是返回该段是否可读或可写,而是当不可读写的时候,引发一个异常(Exception)
结构化异常处理(try-except)
异常:当程序中某种错误触发了一个异常,操作系统会寻找这个异常的处理函数。如果程序提供了错误处理函数,则进入错误处理函数,如果没提供处理函数,则由操作系统默认错误处理函数处理。在内核模式下系统默认的处理错误的方法就是蓝屏,并且在蓝屏上简单描述出错信息,之后系统就进入了死机状态
回卷:程序执行到某个地方出现异常错误时,系统会寻找出错点是否位于一个try块中,并进入try块提供的异常处理代码。如果当前try块没有提供异常处理,则会向外一层的try块寻找异常处理代码。如果到了最外层try块也没提供异常处理代码,则交给操作系统
__try{
}
__except(filter_value) {
}
在被try包围的块中,如果出现异常,会根据filter_value的值进行判断是否需要在except块中进行处理
EXCEPTION_EXECUTE_HANDLER该值为1,进入except进行错误处理,处理完成后不再返回try,而是继续执行
EXCEPTION_CONTINUE_SEARCH,该值为0,不使用except块进行处理,,转而向上一层回卷
结构化异常处理(try-finally)
强迫函数在退出前执行一段代码
NTSTATUS TryFinallyTest()
{
NTSTATUS status=STATUS_SUCESS;
__try{ //do something return STATUS_SUCESS; }
__finally{//程序退出前必然运行到此 KdPrint((“Enter Finally Block”));}
}
上面代码的try块中,无论运行什么代码(即使是return语句或是触发异常),在程序退出前都会执行finally块中的代码,所以将资源回收的代码放到finally块中