POOL驱动不能处理异常的解决方法

相信越来越多的人都喜欢把驱动代码放到Pool里执行,但由此会产生一个问题,在Pool里的驱动代码是不能出异常的,所有的异常处理都会失效,在有些我们不得不使用异常,如操作Ring3内存,这时我们就必须解决掉这个问题。

X86和x64在异常处理上稍有一些不同,先来看x86上的异常处理。

系统捕获到异常后会执行到函数RtlDispatchException,函数RtlDispatchException再调用RtlLookupFunctionEntry,RtlLookupFunctionEntry函数再调用RtlLookupFunctionTable。RtlLookupFunctionTable这个函数的作用是在PsLoadedModuleList链在根据异常的EIP地址找到发生异常的模块。由于Pool里执行的代码不属于任何一个模块,这个函数就会返回失败,异常处理就会失去作用,产生一个蓝屏。

......

ObRegisterCallbacks返回0xC0000022(拒绝访问)解决方案

ObRegisterCallbacks这个函数是在Vista sp1之后的版本中添加的,可用来监控系统中对进线程句柄的操作,如打开进程、复制线程句柄等。

但是使用这个函数对驱动有特殊的要求,必须使用特殊的签名才行!否则这个函数会返回0xC0000022(拒绝访问),逆向此函数可以看到以下是有关是否加签名的判断:

...

VC程序查错之内存访问异常

作者:langouster

先来看下面这张图,相信很多程序员都见过类似。

---------------------------
test1.exe - 应用程序错误
---------------------------
"0x00401002" 指令引用的 "0x00000000" 内存。该内存不能为 "written"。

要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定   取消  
---------------------------

...

VC程序查错之序言

作者:langouster

一直准备写一个关于C、C++程序调错的专题,这个专题面向的主要人群是程序开发人员,从今天开始争取每周写一点,把我所知的一些小东西和大家分享分享。

一。工具准备,我常用的工具有:

VS2005是我用的最多的开发工具,他的强大的调试分析能力注定会成为我们调试程序的首选。

Windbg是微软出的专门的调试器,功能非常强大,支持应用程序与双机驱动调试,但它的界面实在是太简略。

IDA是一款强大的二进制反汇编与分析工具,其中的F5插件支持直接把exe文件反编译成C语言。

...
分页:[«]1[»]

Powered By Z-Blog 2.0 bate Build Theme by toboku

Copyright langouster. Some Rights Reserved.   苏ICP备06046736号