阅读:1384回复:5
filemon驱动向应用程序通信一问
应用程序向驱动通信很容易就看明白了,但是驱动向应用程序通信看了很久,只知道应用程序向驱动传入了一个缓冲区然后驱动向该缓冲写东西,但是写了之后好像没有任何提示,应用程序怎么知道何时该读数据了?LogRecord之后有向应用程序的提示吗?比如事件或消息。谢谢
|
|
最新喜欢:![]() |
沙发#
发布于:2004-07-14 19:38
LogRecord之后没有向应用程序的提示,
应用程序是定时向驱动程序发送IOCTL_FILEMON_GETSTATS命令来 查询缓冲区中是否有数据,如果有的话就把数据读入。 你所说的应用程序向驱动传入了一个缓冲区是什么意思阿? 共享缓冲区么? 至于驱动程序向应用程序通信,前面讨论过很多了,翻翻以前的帖子把:) |
|
|
板凳#
发布于:2004-07-17 10:02
首先多谢回复!我说的缓冲就是OutputBuffer,我后来也估计是应用程序不停的查看该缓冲,驱动向应用程序通信我看的98驱动权威指南,不知道那些方法能否用于2000及以后。
|
|
地板#
发布于:2004-07-17 11:00
美仔细看,应用程序应该是定时读取得
|
|
|
地下室#
发布于:2004-07-18 14:19
LogRecord的缓冲不仅仅是outbuffer那么简单,Filemon有一个类似于链表的结构(我只是大概看了看,或者根本就是一个链表),动态的分配适当的内存区域给驱动程序用来存储记录的Log信息。而应用程序通过发送IOCTL访问这个结构,如果缓冲区中有数据则读出,然后将相应的缓冲区释放。每次应用程序读的时候都把所有的缓冲区中的Log记录循环全部读出,所以这样对于内存的消耗是动态和高效的。
驱动程序主动和应用程序通信比较常用的方法是通过共享事件通知。 基本的步骤如下: 首先,应用程序CreateEvent一个Win32事件,通过IOCTL将其指针传递给驱动; 然后,驱动程序收到Win32事件指针之后,调用ObReferenceByPointer得到事件的句柄; 这样,应用程序可以启动一个线程调用WaitForSingleObject等待驱动层的通知,而驱动程序在需要时对事件KeSetEvent置位,应用程序中等待得线程就可以收到通知了。 |
|
|
5楼#
发布于:2004-07-19 21:05
thanks
|
|