tededward222
驱动牛犊
驱动牛犊
  • 注册日期2003-11-25
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4023回复:18

内核模式如何主动向用户模式发消息

楼主#
更多 发布于:2003-11-25 22:23
各位高手,请问内核模式的驱动程序如何向用户模式的应用程序发送消息?如内核模式向用户模式发送消息,通知应用程序读取数据。

最新喜欢:

antspowerantspo...
dvlper
驱动牛犊
驱动牛犊
  • 注册日期2003-11-25
  • 最后登录2004-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-26 09:18
我也遇到这样的问题,后来看一个例子,它是由应用程序发IRP给驱动,驱动把这个IRP挂起,等到有数据要传给应用程序时,就通过这个挂起的IRP传。我有这个程序的源代码,今天没带,下次给你。
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-26 09:29
没错,就是这样.

因此虽然目的是内核先发起动作,但处理中必须是用户模式先调用DeviceIoControl向内核提供一个IRP,内核保留这个IRP,直到需要通知用户模式的时候再将其填充并Complete.

这里要注意,必须为每个IRP设置一个CancelRoutine,比如:
        //
        // setup the cancel routine
        //
        IoMarkIrpPending(pIrp);
        IoSetCancelRoutine(pIrp, CancelRoutine);







[编辑 -  11/26/03 by  SharpShooter]
写驱动不如买足彩!!
tededward222
驱动牛犊
驱动牛犊
  • 注册日期2003-11-25
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-11-26 11:51
多谢两位前辈的关注,那应用程序如何不断的及时发送IRP?
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-11-26 14:21
多谢两位前辈的关注,那应用程序如何不断的及时发送IRP?


while(true) {
   DeviceIoControl();
   // 成功,则处理.
};

内核Complete一个IRP之前,DeviceIo保持阻塞.

如果需要处理不同的事务,定义多个IO控制码,启用多个线程做类似上面的while(true)循环.
写驱动不如买足彩!!
tededward222
驱动牛犊
驱动牛犊
  • 注册日期2003-11-25
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-26 17:07
那应用程序就琐定了。有人说用event传递消息,可行吗?若可行,如何做?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-11-26 18:12


[编辑 -  12/2/03 by  antspower]
放弃瘟草,现吃李草
yongliliu
驱动小牛
驱动小牛
  • 注册日期2003-10-20
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-11-26 19:38
没见过内核能主动往上送数据的,一般情况都是用户态与内核建立共享的Irp->AssociatedIrp.SystemBuffer数据段,内核通过该数据段获得用户态DeviceIOControl的in数据和长度,包括:IoControlCode,处理完之后再把上传数据填充回Irp->AssociatedIrp.SystemBuffer给用户态,用户态的DeviceIOControl有一个out数据空间和out数据长度。

注意:Irp->AssociatedIrp.SystemBuffer其实就是指向in或者out的指针
成功不是天上掉下来的免费的丰盛的晚餐!
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-11-26 20:57
那应用程序就琐定了。有人说用event传递消息,可行吗?若可行,如何做?

在应用太开线程就可以了!
在98下可以内核主动发起消息,但是在2000中就不行了,必须要使用异步DeviceIoControl或者是命名EVENT等等!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
dvlper
驱动牛犊
驱动牛犊
  • 注册日期2003-11-25
  • 最后登录2004-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-11-26 22:02
关于解决这个问题的源代码在www.codeproject.com上可以找到,这个网站提供很多原创代码。你搜一下filter-hook driver就可以找到一个相关的软件和他的源代码,好运
tededward222
驱动牛犊
驱动牛犊
  • 注册日期2003-11-25
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-11-27 11:57
开线程似乎方便一些。关于event,在DDK2000的例子里读那个源程序比较好。
TO:delper,www.codeproject.com怎么上不去?
还有,加分的按钮怎么找不到了,怎么给你们加分?
dvlper
驱动牛犊
驱动牛犊
  • 注册日期2003-11-25
  • 最后登录2004-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-11-28 17:01
不会吧,我都有上去
tededward222
驱动牛犊
驱动牛犊
  • 注册日期2003-11-25
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-11-28 23:07
上去了
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-12-01 15:42
那应用程序就琐定了。有人说用event传递消息,可行吗?若可行,如何做?


应用程序就锁定了?才怪。前面说了: 内核必须为每个IRP设置CancelRoutine.


[编辑 -  12/1/03 by  SharpShooter]
写驱动不如买足彩!!
cc_file
驱动牛犊
驱动牛犊
  • 注册日期2003-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-12-02 23:41
可以的。可以参见一本有关wdm驱动的书,大概是一个叫武安河写的。
大概的思路:
1。app生成一个event
2。app通过devioctl把event的handle传给driver
3。app开一个thread等待event发生
4。driver在有数据要上交的时候就set event
5。app被事件激活,再用devioctl从driver读数据
我站在人群中,笑容如阳光般的灿烂,但是你可知道,我心底的忧伤...
tededward222
驱动牛犊
驱动牛犊
  • 注册日期2003-11-25
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-12-03 12:00
\"3。app开一个thread等待event发生\"
这步太重要了,开始没意识到。多谢
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2013-07-05 17:20
竟然10年之后俺的ID/密码还在!!!!!!!
还好常用密码多年没有改过.
看到10年前的帖子,心情很是复杂啊...................
我,就是sharpshooter.....那时候有人叫我sha bi shooter....
 
谁知道什么是sharpshooter么? :)
写驱动不如买足彩!!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2013-07-05 17:34
感慨呀,当年天天相伴的SoftICE, Numega搜了一下wikipage,竟然2006年,DriverStudio/SoftICE就终结了。。。。恍如隔世。
写驱动不如买足彩!!
wangycGG
驱动牛犊
驱动牛犊
  • 注册日期2015-09-25
  • 最后登录2016-03-14
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2015-09-26 13:19
上面各位说的很全了,我再总结一下:

Ring0通知Ring3的方法有两种:

1)不需要共享内存的情况下,可以共享一个Event,由ring3创建并传递给ring0,ring3启动线程等待该Event置信。

2)需要共享内存的情况下,由ring3通过DeviceIOControl发起异步IRP,ring0将IRP挂起,当完成IRP之后通过执行IOCompleteRequest来通知ring3。当然ring3也需要等待随IRP一同下去的事件置信。
游客

返回顶部