阅读:4452回复:18
内核模式如何主动向用户模式发消息
各位高手,请问内核模式的驱动程序如何向用户模式的应用程序发送消息?如内核模式向用户模式发送消息,通知应用程序读取数据。
|
|
最新喜欢:antspo... |
沙发#
发布于:2003-11-26 09:18
我也遇到这样的问题,后来看一个例子,它是由应用程序发IRP给驱动,驱动把这个IRP挂起,等到有数据要传给应用程序时,就通过这个挂起的IRP传。我有这个程序的源代码,今天没带,下次给你。
|
|
板凳#
发布于: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] |
|
|
地板#
发布于:2003-11-26 11:51
多谢两位前辈的关注,那应用程序如何不断的及时发送IRP?
|
|
地下室#
发布于:2003-11-26 14:21
多谢两位前辈的关注,那应用程序如何不断的及时发送IRP? while(true) { DeviceIoControl(); // 成功,则处理. }; 内核Complete一个IRP之前,DeviceIo保持阻塞. 如果需要处理不同的事务,定义多个IO控制码,启用多个线程做类似上面的while(true)循环. |
|
|
5楼#
发布于:2003-11-26 17:07
那应用程序就琐定了。有人说用event传递消息,可行吗?若可行,如何做?
|
|
6楼#
发布于:2003-11-26 18:12
[编辑 - 12/2/03 by antspower] |
|
|
7楼#
发布于:2003-11-26 19:38
没见过内核能主动往上送数据的,一般情况都是用户态与内核建立共享的Irp->AssociatedIrp.SystemBuffer数据段,内核通过该数据段获得用户态DeviceIOControl的in数据和长度,包括:IoControlCode,处理完之后再把上传数据填充回Irp->AssociatedIrp.SystemBuffer给用户态,用户态的DeviceIOControl有一个out数据空间和out数据长度。
注意:Irp->AssociatedIrp.SystemBuffer其实就是指向in或者out的指针 |
|
|
8楼#
发布于:2003-11-26 20:57
那应用程序就琐定了。有人说用event传递消息,可行吗?若可行,如何做? 在应用太开线程就可以了! 在98下可以内核主动发起消息,但是在2000中就不行了,必须要使用异步DeviceIoControl或者是命名EVENT等等! |
|
|
9楼#
发布于:2003-11-26 22:02
关于解决这个问题的源代码在www.codeproject.com上可以找到,这个网站提供很多原创代码。你搜一下filter-hook driver就可以找到一个相关的软件和他的源代码,好运
|
|
10楼#
发布于:2003-11-27 11:57
开线程似乎方便一些。关于event,在DDK2000的例子里读那个源程序比较好。
TO:delper,www.codeproject.com怎么上不去? 还有,加分的按钮怎么找不到了,怎么给你们加分? |
|
11楼#
发布于:2003-11-28 17:01
不会吧,我都有上去
|
|
12楼#
发布于:2003-11-28 23:07
上去了
|
|
13楼#
发布于:2003-12-01 15:42
那应用程序就琐定了。有人说用event传递消息,可行吗?若可行,如何做? 应用程序就锁定了?才怪。前面说了: 内核必须为每个IRP设置CancelRoutine. [编辑 - 12/1/03 by SharpShooter] |
|
|
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读数据 |
|
|
15楼#
发布于:2003-12-03 12:00
\"3。app开一个thread等待event发生\"
这步太重要了,开始没意识到。多谢 |
|
16楼#
发布于:2013-07-05 17:20
竟然10年之后俺的ID/密码还在!!!!!!!
还好常用密码多年没有改过. 看到10年前的帖子,心情很是复杂啊................... 我,就是sharpshooter.....那时候有人叫我sha bi shooter.... 谁知道什么是sharpshooter么? :) |
|
|
17楼#
发布于:2013-07-05 17:34
感慨呀,当年天天相伴的SoftICE, Numega搜了一下wikipage,竟然2006年,DriverStudio/SoftICE就终结了。。。。恍如隔世。
|
|
|
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一同下去的事件置信。 |
|