AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:3302回复:9

怎样用信号量同步驱动程序和应用程序

楼主#
更多 发布于:2004-08-16 16:23
比如串口程序能够用WaitCommEvent可以等待到驱动程序发来的事件,另外ReadFile WriteFile  DeviceIoControl 等都能通过事件来等待到驱动程序的运行结果,我想问一下,驱动程序中要怎样用事件通知应用程序!

最新喜欢:

mapoflmapofl
AthlonxpX86(桃源村)
zhoujiamurong
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2009-05-06
  • 粉丝4
  • 关注0
  • 积分1081分
  • 威望360点
  • 贡献值0点
  • 好评度215点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-24 13:20
VOID OnInterestingEvent(...) //弱弱的问题,请问这个是函数是在关联哪里啊?
{
...
CompleteRequest(pdx->NotifyIrp, STATUS_SUCCESS, 0);
}
AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-17 15:26
哦,找到了,就在眼皮子底下,居然没看到programing WDM
AthlonxpX86(桃源村)
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-17 13:23
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驱动程序也无效。

 
AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-17 13:17
还有你说的那本书的电子版能提供个连接吗?再次感谢
AthlonxpX86(桃源村)
AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-17 12:27
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驱动程序也无效。

 


谢谢楼上的朋友,我要的就是第二种方法,“使用事件通知应用程序”,好,立刻结贴给分
AthlonxpX86(桃源村)
hongdou
驱动牛犊
驱动牛犊
  • 注册日期2004-06-15
  • 最后登录2006-03-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于: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驱动程序也无效。

水来啊
AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-17 00:59
我的意思是用户模式程序怎样能应用核心模式创建的事件对象,或者核心模式怎样应用用户模式的事件对象,
AthlonxpX86(桃源村)
AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-16 23:30
KESETEVENT

能说的详细点吗?
AthlonxpX86(桃源村)
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2004-08-16 16:56
KESETEVENT
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部