需要注意一点的事情是:SEH虽然在系统中有利用,但是编程中的SEH由MS提供的编译器提供支持,因此在驱动中也是可以使用SEH的。虽然说不能处理异 常HANDLE访问方面的问题(MJ0011语,未经本人测试),但是在很多情况下,SEH还是可以使用以加强驱动的稳定性和健壮性。
和VC++中的编程一样,在驱动中可以使用的SEH处理结构包括try-catch和try-finally结构。
其 中value的值包括EXCEPTION_EXECUTE_HANDLER(不执行try,继续执行)、 EXCEPTION_CONTINUE_SEARCH(不使用except内容,而是用外层异常处理)、 EXCEPTION_CONTINUE_EXECUTION(重复先前错误指令,很少使用)。
这个是在函数异常推出之前最后执行一段代码,某些情况下可以进行资源回收,还可以简化代码...
举个例子,假如我们在驱动中需要判别一个地址是否可写,或者暴力进行内核寻址的时候(邪恶的人请路过),需要在之前判断这个地址是否可以执行我们的操作,比如判断是否可写的时候,我们可以用下面的代码来实现这个功能。
和VC++中的编程一样,在驱动中可以使用的SEH处理结构包括try-catch和try-finally结构。
- __try
- {
- }
- __except(value)
- {
- }
- __try
- {
- }
- __finally
- {
- }
举个例子,假如我们在驱动中需要判别一个地址是否可写,或者暴力进行内核寻址的时候(邪恶的人请路过),需要在之前判断这个地址是否可以执行我们的操作,比如判断是否可写的时候,我们可以用下面的代码来实现这个功能。
- #pragma INITCODE
- VOID ProbeTest()
- {
- PVOID badPointer = NULL;
- KdPrint(("Enter ProbeTest/n"));
- __try
- {
- KdPrint(("Enter __try block/n"));
- //判断空指针是否可读,显然会导致异常
- ProbeForWrite(badPointer,100,4);
- //由于在上面引发异常,所以以后语句不会被执行!
- KdPrint(("Leave __try block/n"));
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- KdPrint(("Catch the exception/n"));
- KdPrint(("The program will keep going/n"));
- }
- //该语句会被执行
- KdPrint(("Leave ProbeTest/n"));
- }