zylc369
论坛版主
论坛版主
  • 注册日期2011-11-07
  • 最后登录2013-03-04
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2199回复:1

驱动卸载时蓝屏,但加上一个空的结构化异常就不会蓝屏,这是为什么

楼主#
更多 发布于:2011-11-30 19:37
这一段代码,主要是驱动读写
pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDWrite;
pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKRead;
pDriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = HelloDDKQueryInfomation;


这个是设备扩展结构


typedef struct _DEVICE_EXTENSION {    PDEVICE_OBJECT pDevice;
    UNICODE_STRING ustrDeviceName;    //设备名称    UNICODE_STRING ustrSymLinkName;    //符号链接名

    PUCHAR buffer;//缓冲区
    ULONG file_length;//模拟的文件长度,必须小于MAX_FILE_LENGTH} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
CreateDevice函数给这个结构体的buffer字段申请了内存
而在卸载的时候释放内存
卸载驱动时就蓝屏,但是在卸载驱动的函数中,加入空的结构化异常

__try{
}__except(1)
{}
这种什么都不做的语句就能不蓝屏,让我很纳闷
只要加入上面的异常处理,卸载函数标记为code_seg("PAGE")和code_seg("INIT")都无所谓,若不加,不管标记成什么都蓝屏。
加载驱动的函数和CreateDevice创建设备的函数我的代码中都标记为code_seg("INIT"),内存申请是在CreateDevice函数中
我测试过加载驱动函数、卸载驱动函数、CreateDevice函数,若都标记成code_seg("PAGE")就不会蓝屏
难道是申请内存的时候不能表集成code_seg("INIT")?code_seg("INIT")我理解的是运行完函数,就从内存卸载,但是DEVICE_EXTENSION结构体是用指针引用的,申请了内存,但你就是卸载了这块运行函数的内存,但和我指针指向的地址没关系吧?


如果我只实现对IRP_MJ_READ 的处理,即pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKRead;别的都用最简处理的话,那么一切都正常。。。这让我很是不解。以下是我的源码
HelloDDK.rar
guijc1
驱动牛犊
驱动牛犊
  • 注册日期2008-06-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望231点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
沙发#
发布于:2012-01-11 18:22
试了一下午,把HelloDDKDispatchRoutin例程前边的 #pragma PAGEDCODE 注释掉就好了,
 
看起来好像不是每个派遣函数都能被PAGEDCODE的,这种优化我觉得不熟悉的时候还是让编译器去做最好,自己贸然去改,结果就成“画蛇添足”了
游客

返回顶部