SEH在驱动中的应用

需要注意一点的事情是:SEH虽然在系统中有利用,但是编程中的SEH由MS提供的编译器提供支持,因此在驱动中也是可以使用SEH的。虽然说不能处理异 常HANDLE访问方面的问题(MJ0011语,未经本人测试),但是在很多情况下,SEH还是可以使用以加强驱动的稳定性和健壮性。
和VC++中的编程一样,在驱动中可以使用的SEH处理结构包括try-catch和try-finally结构。
  1. __try
  2. {

  3. }
  4. __except(value)
  5. {

  6. }
其 中value的值包括EXCEPTION_EXECUTE_HANDLER(不执行try,继续执行)、 EXCEPTION_CONTINUE_SEARCH(不使用except内容,而是用外层异常处理)、 EXCEPTION_CONTINUE_EXECUTION(重复先前错误指令,很少使用)。
  1. __try
  2. {

  3. }
  4. __finally
  5. {

  6. }
这个是在函数异常推出之前最后执行一段代码,某些情况下可以进行资源回收,还可以简化代码...

举个例子,假如我们在驱动中需要判别一个地址是否可写,或者暴力进行内核寻址的时候(邪恶的人请路过),需要在之前判断这个地址是否可以执行我们的操作,比如判断是否可写的时候,我们可以用下面的代码来实现这个功能。
  1. #pragma INITCODE
  2. VOID ProbeTest()
  3. {
  4.     PVOID badPointer = NULL;
  5.     KdPrint(("Enter ProbeTest/n"));
  6.     __try
  7.     {
  8.         KdPrint(("Enter __try block/n"));
  9.         //判断空指针是否可读,显然会导致异常
  10.         ProbeForWrite(badPointer,100,4);
  11.         //由于在上面引发异常,所以以后语句不会被执行!
  12.         KdPrint(("Leave __try block/n"));
  13.     }
  14.     __except(EXCEPTION_EXECUTE_HANDLER)
  15.     {
  16.         KdPrint(("Catch the exception/n"));
  17.         KdPrint(("The program will keep going/n"));
  18.     }
  19.     //该语句会被执行
  20.     KdPrint(("Leave ProbeTest/n"));
  21. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值