liskman
驱动牛犊
驱动牛犊
  • 注册日期2002-05-11
  • 最后登录2007-08-31
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1641回复:5

怎样通知用户程序中断发生?

楼主#
更多 发布于:2003-12-01 17:35
使用KernelDriver 6.11编写驱动程序,但是不知怎样将发生的中断事件通知运行在用户模式下的程序 :(

KernelDrvier生成的代码中,只演示回调函数在内核态,不能回调用户态的函数 :(
如果能回调,怎样实现?

能不能在用户程序中用CreateEvent生成一个事件句柄,将句柄传给驱动程序,在中断服务程序中用SetEvent设置事件?


中断服务运行在什么级别,在中断服务中不能向用户态的内存缓冲区复制数据吗?

[编辑 -  12/1/03 by  liskman]
流云
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2003-12-01 18:58
能不能在用户程序中用CreateEvent生成一个事件句柄,将句柄传给驱动程序,在中断服务程序中用SetEvent设置事件?
对,可以
然后在用户层通过IOCTL传内存地址过来接受数据。。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
liskman
驱动牛犊
驱动牛犊
  • 注册日期2002-05-11
  • 最后登录2007-08-31
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-01 23:08
能举一些代码样例吗?
当时用KernelDriver 5.xx时,有一个KEvent类,可以用用户程序的事件句柄进行初始化,然后操作该事件句柄.
现在KernelDriver 6.xx中没有了该工具类,请问代码该怎么写?
流云
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2003-12-02 09:53
RING3:
CreateEvent
DeviceIoControl
WaitForSingleObject
RING0:
IoCreateNotificationEvent
KeSetEvent
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
icube
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2004-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-02 16:41
在中断服务例程中是绝对不能调用SetEvent的,SetEvent的调用IRQL不应高于DISPATCH_LEVEL。在ISR中可以读写用户缓冲区,但是前提是用户缓冲区被锁定并且映射到了系统地址空间(可以看看mdl)。你如果想将中断事件通知运行在用户模式下的程序,不应该通过SetEvent之类的方法来完成,采用读设备或者自定义的IOCTL来完成比较好,你的用户线程可以向设备发出IOCTL,驱动接受到请求后不立即完成该请求,当你的设备发生中断,在中断的DPCForISR中完成用户线程的IOCTL请求,你的用户线程就可以知道中断发生了,当然这不是实时的,NT本身就不是
liskman
驱动牛犊
驱动牛犊
  • 注册日期2002-05-11
  • 最后登录2007-08-31
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-12-04 23:12
多谢!

发现用
ObReferenceObjectByHandle(hEvent, GENERIC_ALL, NULL, KernelMode, &gpEventObject, &objHandleInfo);

KeSetEvent( gpEventObject, 0, FALSE);

ObDereferenceObject(gpEventObject);
也很好使
流云
游客

返回顶部