阅读:2431回复:1
驱动卸载时蓝屏,但加上一个空的结构化异常就不会蓝屏,这是为什么
这一段代码,主要是驱动读写
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 |
|
沙发#
发布于:2012-01-11 18:22
试了一下午,把HelloDDKDispatchRoutin例程前边的 #pragma PAGEDCODE 注释掉就好了,
看起来好像不是每个派遣函数都能被PAGEDCODE的,这种优化我觉得不熟悉的时候还是让编译器去做最好,自己贸然去改,结果就成“画蛇添足”了 |
|