Chinaunix首页 | 论坛 | 博客
  • 博客访问: 433142
  • 博文数量: 72
  • 博客积分: 1583
  • 博客等级: 上尉
  • 技术积分: 775
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-23 09:36
文章分类

全部博文(72)

文章存档

2011年(72)

我的朋友

分类: 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块中

阅读(3516) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~