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. }

你可能感兴趣的:(exception,编程,编译器,search,测试)