阅读:3299回复:9
怎样用信号量同步驱动程序和应用程序
比如串口程序能够用WaitCommEvent可以等待到驱动程序发来的事件,另外ReadFile WriteFile DeviceIoControl 等都能通过事件来等待到驱动程序的运行结果,我想问一下,驱动程序中要怎样用事件通知应用程序!
|
|
最新喜欢:![]()
|
沙发#
发布于:2004-08-16 16:56
KESETEVENT
|
|
|
板凳#
发布于:2004-08-16 23:30
KESETEVENT 能说的详细点吗? |
|
|
地板#
发布于:2004-08-17 00:59
我的意思是用户模式程序怎样能应用核心模式创建的事件对象,或者核心模式怎样应用用户模式的事件对象,
|
|
|
地下室#
发布于:2004-08-17 09:14
WDM驱动模型设计第9章
应用程序关注事件的通知 IOCTL操作的一个极其重要的用途就是为WDM驱动程序提供了一种方法来通知应用程序其关注事件的发生。为了引发这个讨论,假定你有一个需要与驱动程序紧密合作的应用程序,当某种硬件事件发生时,驱动程序就通知应用程序以便其作出某种用户可见的动作。例如,当按下医疗设备上的某个按钮时将触发应用程序收集和显示数据。对于这种情况,Windows为驱动程序通知应用程序提供了两种方法(异步过程调用或发送window消息),但这些方法不能在Windows 2000中使用(缺乏必要的底层支持),一种可行的方法是使应用程序发出IOCTL操作,而驱动程序在被关注事件发生时完成该操作。实现这个方法需要格外小心,我将详细解释这个方法。 当应用程序想从驱动程序接收事件通知时,应该调用DeviceIoControl: HANDLE hDevice = CreateFile("\\\\.\\<driver-name>", ...); BOOL okay = DeviceIoControl(hDevice, IOCTL_WAIT_NOTIFY, ...); (IOCTL_WAIT_NOTIFY是我用在NOTIFY例子中的控制代码) 驱动程序将挂起这个IOCTL并在以后完成。如果没有“其它考虑”,实际代码就象下面这样简单: NTSTATUS DispatchControl(...) { ... switch (code) { case IOCTL_WAIT_NOTIFY: pdx->NotifyIrp = Irp; IoMarkIrpPending(Irp); return STATUS_PENDING; ... } } VOID OnInterestingEvent(...) { ... CompleteRequest(pdx->NotifyIrp, STATUS_SUCCESS, 0); } 使用事件通知应用程序 有时驱动程序所要做的全部就是通知应用程序事件已经发生,不必向应用程序传递任何解释性的数据。能做到这一点的一个标准技术是让驱动程序发出一个普通的Win32事件信号。为此,应用程序首先要调用CreateEvent或OpenEvent打开一个事件对象句柄,然后通过调用DeviceIoControl把该事件句柄传递给驱动程序。驱动程序通过下面函数可以把该用户模式句柄转换成一个对象指针: PKEVENT pEvent; status = ObReferenceObjectByHandle(hEvent, EVENT_MODIFY_STATE, *ExEventObjectType, Irp->RequestorMode, (PVOID*) &pEvent, NULL); 注意该IOCTL必须在PASSIVE_LEVEL级上处理,并且在拥有hEvent句柄的进程上下文中。 在此,驱动程序有了一个KEVENT对象的指针,它可以在适当时候作为调用KeSetEvent的参数。该驱动程序还拥有对该事件对象的参考计数,因此它必须在某一点上调用ObDereferenceObject。取消对象参考的恰当时间取决于应用程序与驱动程序的合作方式。比较好的办法是作为IRP_MJ_CLOSE处理的一部分,光盘上的EVWAIT例子演示了这种使用方法。 内核服务例程IoCreateNotificationEvent和IoCreateSynchronizationEvent创建的事件对象可以被用户模式应用程序所共享。但它们在Windows 98中无效,因此对真正的WDM驱动程序也无效。 |
|
|
5楼#
发布于:2004-08-17 12:27
WDM驱动模型设计第9章 谢谢楼上的朋友,我要的就是第二种方法,“使用事件通知应用程序”,好,立刻结贴给分 |
|
|
6楼#
发布于:2004-08-17 13:17
还有你说的那本书的电子版能提供个连接吗?再次感谢
|
|
|
7楼#
发布于:2004-08-17 13:23
WDM驱动模型设计第9章 |
|
8楼#
发布于:2004-08-17 15:26
哦,找到了,就在眼皮子底下,居然没看到programing WDM
|
|
|
驱动小牛
![]() |
9楼#
发布于:2007-09-24 13:20
VOID OnInterestingEvent(...) //弱弱的问题,请问这个是函数是在关联哪里啊?
{ ... CompleteRequest(pdx->NotifyIrp, STATUS_SUCCESS, 0); } |