内核模式驱动程序和用户模式应用程序之间的双向通信?

我需要内核模式的WFP驱动程序和用户模式应用程序之间的双向通信。 驱动程序通过将URL传递给应用程序来启动通信,然后对该URL进行分类(娱乐,新闻,成人等)并将该类别传回给驱动程序。 驱动程序需要知道filterfunction中的类别,因为它可能会根据该信息阻止某些网页。 我在应用程序中创build了一个线程,驱动程序将使用URL和GUID进行I / O请求,然后应用程序将该类别写入该驱动程序将拾取的GUID下的registry中。 不幸的是,正如驱动程序validation者指出的,这是不稳定的,因为Zwregistry函数必须在PASSIVE_LEVEL上运行。 我正考虑尝试与映射的内存缓冲区相同的事情,但我不确定中断要求是什么。 另外,我想在降低中断级别之前registry函数调用,但我不知道是什么副作用。

你只需要有两种不同的I / O请求。

如果您使用DeviceIoControl来检索URL(我认为这将是最合适的方法),这就像添加第二个I / O控制代码一样简单。

如果你使用的是ReadFile或者类似的东西,事情通常会变得有些乱七八糟,但是在这种情况下,你只有两种操作,一种是读取(驱动程序 – >应用程序),另一种是一个写(应用程序 – >驱动程序)。 所以你可以使用WriteFile来发送回复,当然也包括GUID,这样驱动程序可以将你的回复与正确的查询进行匹配。

另一种方法(更类似于原来的方法)是使用共享内存缓冲区。 看到这个答案的更多细节。 这个想法的问题是,你要么需要使用自旋锁(以系统性能和功耗为代价,当然不能在单核系统上工作)或轮询(这既是低效的,不太适合时间敏感的操作)。

关于PASSIVE_LEVEL没有什么不稳定的。 访问注册表必须处于PASSIVE_LEVEL状态,因此如果驱动程序在更高的IRQL下运行,则无法直接访问。 不过,您可以通过卸载到工作项目来完成。 通常不推荐降低IRQL,因为它与OS的意图相矛盾。

你的协议确实听起来有些麻烦,做一个直接的应用程序驱动程序通信可能是可取的。 你可以在这里找到有用的信息: http : //msdn.microsoft.com/en-us/library/windows/hardware/ff554436(v=vs.85).aspx

由于标注位于DISPATCH中,因此您的处理必须在工作线程或DPC中完成,这将允许您使用ZwXXX。 你应该为了通信目的而倒置回调,在OSR上有一个很好的文档。

我刚开始在世界粮食计划署周围开始讨论,但即使在他们提供的样本中,微软也会重新收集数据包。 我没有仔细研究它,但似乎他们放弃数据包,并重新注入处理。 这对你的使用模式引擎来做决定就足够了。 你还应该限制数据包捕获到一个特定的端口(在你的情况下80),这样你就不会做你不需要的额外处理。