阅读:2504回复:11
设备扩展device_extension是全局的吗?
我在device_extension中定义了一个事件句柄,通过应用程序的DeviceIoControl后将应用程序的事件对象传递给了驱动程序,在有些地方驱动程序得到的event句柄不是NULL,但是在有些地方却是。
为什么? 我觉得device_extension应该是全局的呀 |
|
最新喜欢:sunmac... |
沙发#
发布于:2002-04-20 15:05
我在device_extension中定义了一个事件句柄,通过应用程序的DeviceIoControl后将应用程序的事件对象传递给了驱动程序,在有些地方驱动程序得到的event句柄不是NULL,但是在有些地方却是。 你的程序运行稳定吗? |
|
板凳#
发布于:2002-04-20 15:10
我在device_extension中定义了一个事件句柄,通过应用程序的DeviceIoControl后将应用程序的事件对象传递给了驱动程序,在有些地方驱动程序得到的event句柄不是NULL,但是在有些地方却是。 设备扩展是附在设备对象中的一个数据结构,你的事件句柄需要在应用程序调用DeviceIoControl以后才能被设置,在此之前,你需要将其初始化为NULL。 |
|
|
地板#
发布于:2002-04-20 21:24
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-04-20 21:55
我讲详细一点:
我现在对FileMon的FileM.sys驱动进行修改,我添加了ID_File_Event接口。当应用程序使用该接口的时候,将其创建的事件对象Event传递给驱动程序FileM.sys,在驱动收到这样的IRP后,我通过 case ID_File_Event : ObReferenceObjectByHandle(*((HANDLE*)(InputBuffer)), 0x0002, NULL, UserMode, (PVOID *)(&(hookExt->Event)), NULL); 就将事件句柄传递到了设备扩展的句柄成员Event, 如果我紧接着调用 KeSetEvent(hookExt->Event, 2, FALSE); 在应用程序中能够知道Event的信号被设置为信号态,这说明驱动程序得到了事件的句柄。 但是 KeSetEvent(hookExt->Event, 2, FALSE);这一语句不是立刻调用的。我将它放在驱动程序捕捉到对硬盘的进行Create的时间中,即: case IRP_MJ_CREATE: if(hookExt->Event) KeSetEvent(hookExt->Event, 2, FALSE); 我发现在应用程序DeviceIoControl后此时的hookExt->Event为NULL。 请问 为什么? 谢谢 |
|
5楼#
发布于:2002-04-21 01:28
可以明确的告诉你的是这个是全局的!
|
|
6楼#
发布于:2002-04-21 01:29
至于为什么有你说的那个问题就只能自己找代码的原因了!
|
|
7楼#
发布于:2002-04-21 10:45
我大概知道问题在哪里了,谢谢各位的参与!
|
|
8楼#
发布于:2002-04-22 14:20
我大概知道问题在哪里了,谢谢各位的参与! 我觉得既然知道了,不妨告诉大家阿:) |
|
|
9楼#
发布于:2002-04-22 14:54
我发现这是由于在Filem.sys中生成了多个设备对象所造成的。
在这个驱动程序中,生成了2个设备对象,一个是与应用程序交互的filemon,另一个是加在文件驱动上的过滤驱动设备对象。而我只是将事件对象传递给了filemon,而没有传给过滤驱动设备对象。所以在过滤驱动设备对象的设备扩展中的Event就为null。 但是我想明白:如何在驱动程序中让一个设备对象访问另外一个设备对象的设备扩展中的成员? |
|
10楼#
发布于:2002-04-22 22:59
这个简单啊!你用链,把这些设备对象指针全部连起来啊!然后用一个全局指针保存,不就可以啦!其实在驱动里面编写程序和写应用程序差别不大,虽然有一定的差别!
|
|
11楼#
发布于:2002-04-22 23:03
不过告诉你一个秘密吧!在你的驱动程序对象里面有一个成员是设备对象指针类型的,指向的是你最后一个创建的设备对象!而在这个设备对象里面又有一个指针指向上一个!知道最后一个为空!
也就是说当驱动程序a创建的设备对象过程是 A,B,C,D,E 那么在驱动对象里面有一个指针指向了!E而E里面有一个指针指向了D,在D里面有一个指针指向了C,就这样一个链啦! |
|