kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1568回复:10

关于DPC和通知应用程序

楼主#
更多 发布于:2002-10-11 09:12
一块PCI卡,作接收数据用,一旦FIFO满则发中断,驱动程序在DPC中把FIFO中的数据读到设备扩展的PackData数组中。
因为设备扩展不能为应用程序直接所用,所以在应用程序中使用DeviceIoControl可以将PackData中的数据读到用户的指定位置。
这样的工作过程对吗?

现有一个问题,对于驱动程序,当中断来时可以自动处理,但是当DPC结束,也就是接收数据结束时,有什么方法可以通知上层应用程序,使应用程序知道可以调用DeviceIoControl接收数据呢?

最新喜欢:

hapihapi
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-11 09:30
使用事件(event)对象通知 :D
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-11 10:12
使用事件(event)对象通知 :D
 

过程是否是这样:
1、在驱动中中定义全局的事件对象
2、在DPC中SetEvent
3、在上层应用中用WaitForSingleObject等待该对象

问题:
事件对象可以直接由底层传递到上层应用程序吗?也就是DPC中SET的事件对象直接可以被应用程序所看见?
我记得DPC工作在DISPATCH_LEVEL,只能访问非分页内存,而上层应用是无法访问非分页内存的呀?
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-11 10:18
这只是一种方法,还有一些。
我一般是这样用的,

在应用层还要openevent,获得该对象的句柄

事件对象是个内核对象,和非分页内存无关
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-11 11:13
这只是一种方法,还有一些。
我一般是这样用的,

在应用层还要openevent,获得该对象的句柄

事件对象是个内核对象,和非分页内存无关
 

是否是这样:
在驱动程序里用KeInitializeEvent和KeSetEvent初始化和设置KEVENT类型的变量
在应用程序中OpenEvent得到一个句柄,然后WaitForSingleObject这个句柄。但是OpenEvent的最后一个参数是什么,是KEVENT类型的那个变量的名字吗?
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-11 11:24
对, :D
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-11 11:55
OpenEvent返回错误值2,The system cannot find the file specified。
我觉得应该还是最后一个参数的问题。OpenEvent最后一个参数要求是Event的名字,而我用的是驱动中KEVENT类型的变量的名字。是不是要把EVENT放到系统的名字空间之类的。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-11 12:05
你在驱动中创建事件时IoCreateNotificationEvent用的什么名字,这就用什么名字
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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就发生缺页死机了,任务紧急我却一直没有进展,真是欲哭无泪啊。
还有什么地方我没有考虑到吗?  :(
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-14 10:35
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就发生缺页死机了,任务紧急我却一直没有进展,真是欲哭无泪啊。
还有什么地方我没有考虑到吗?  :(


大虾们请看看,帮帮我吧――绝望的人!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
游客

返回顶部