阅读:1568回复:10
关于DPC和通知应用程序
一块PCI卡,作接收数据用,一旦FIFO满则发中断,驱动程序在DPC中把FIFO中的数据读到设备扩展的PackData数组中。
因为设备扩展不能为应用程序直接所用,所以在应用程序中使用DeviceIoControl可以将PackData中的数据读到用户的指定位置。 这样的工作过程对吗? 现有一个问题,对于驱动程序,当中断来时可以自动处理,但是当DPC结束,也就是接收数据结束时,有什么方法可以通知上层应用程序,使应用程序知道可以调用DeviceIoControl接收数据呢? |
|
最新喜欢:hapi |
沙发#
发布于:2002-10-11 09:30
使用事件(event)对象通知 :D
|
|
|
板凳#
发布于:2002-10-11 10:12
使用事件(event)对象通知 :D 过程是否是这样: 1、在驱动中中定义全局的事件对象 2、在DPC中SetEvent 3、在上层应用中用WaitForSingleObject等待该对象 问题: 事件对象可以直接由底层传递到上层应用程序吗?也就是DPC中SET的事件对象直接可以被应用程序所看见? 我记得DPC工作在DISPATCH_LEVEL,只能访问非分页内存,而上层应用是无法访问非分页内存的呀? |
|
地板#
发布于:2002-10-11 10:18
这只是一种方法,还有一些。
我一般是这样用的, 在应用层还要openevent,获得该对象的句柄 事件对象是个内核对象,和非分页内存无关 |
|
|
地下室#
发布于:2002-10-11 11:13
这只是一种方法,还有一些。 是否是这样: 在驱动程序里用KeInitializeEvent和KeSetEvent初始化和设置KEVENT类型的变量 在应用程序中OpenEvent得到一个句柄,然后WaitForSingleObject这个句柄。但是OpenEvent的最后一个参数是什么,是KEVENT类型的那个变量的名字吗? |
|
5楼#
发布于:2002-10-11 11:24
对, :D
|
|
|
6楼#
发布于:2002-10-11 11:55
OpenEvent返回错误值2,The system cannot find the file specified。
我觉得应该还是最后一个参数的问题。OpenEvent最后一个参数要求是Event的名字,而我用的是驱动中KEVENT类型的变量的名字。是不是要把EVENT放到系统的名字空间之类的。 |
|
7楼#
发布于:2002-10-11 12:05
你在驱动中创建事件时IoCreateNotificationEvent用的什么名字,这就用什么名字
|
|
|
8楼#
发布于:2002-10-12 18:02
FAINT呀!发生缺页错误之后重启,结果发现我的测试程序完全没有了,无法恢复!
重新写了测试程序之后,发现还是在KeSetEvent时发生缺页错误,我的驱动这样写的: 1、在设备扩展中定义HANDLE和KEVENT变量,在设备扩展之外定义UniCodeString型变量存放事件对象的名字 2、在AddDevice中 RtlInitUnicodeString (&eventName, L\"\\\\BaseNamedObjects\\\\ReadData\") ; dx->DpcComplete=IoCreateNotificationEvent (&eventName,&dx->Event) ; 3、在DPC中 KeSetEvent(dx->DpcComplete,0,FALSE); KeClearEvent(dx->DpcComplete); 测试程序中: CreateEvent(NULL,TRUE,FALSE,\"ReadData\"); OpenEvent(SYNCHRONIZE, FALSE, \"ReadData\") ; 两句运行分别返回了不同的句柄。 运行测试程序用SOFTICE跟踪到KeSetEvent就发生缺页死机了,任务紧急我却一直没有进展,真是欲哭无泪啊。 还有什么地方我没有考虑到吗? :( |
|
9楼#
发布于:2002-10-14 10:35
FAINT呀!发生缺页错误之后重启,结果发现我的测试程序完全没有了,无法恢复! 大虾们请看看,帮帮我吧――绝望的人! |
|
10楼#
发布于:2002-10-14 10:50
还没有搞定呀
你按照这个顺序做试试 adddevice中: RtlInitUnicodeString (&eventName, L\"\\\\BaseNamedObjects\\\\ReadData\") ; dx->DpcComplete=IoCreateNotificationEvent (&eventName,&dx->Event) ; //使用前需要先清除事件 KeClearEvent(dx->DpcComplete); 测试程序中: //此处不需要再创建event了,因为你已经在驱动中创建了 OpenEvent(EVENT_ALL_ACCESS, FALSE, _T(\"ReadData\")) ; dpc中: KeSetEvent(dx->DpcComplete,0,FALSE); 好了试试吧,祝你好运 :D :D :D |
|
|