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

时间:2012-12-28 15:10:56

标签: windows driver interrupt wfp windows-kernel

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

3 个答案:

答案 0 :(得分:2)

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

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

如果你正在使用ReadFile或同等的东西,通常会有点麻烦,但在这种特殊情况下,你只有两种操作,其中一种是读取(驱动程序 - > ;应用程序),另一个是写(application->驱动程序)。因此,您可以使用WriteFile发送回复,当然包括GUID,以便驱动程序可以将您的回复与正确的查询进行匹配。

另一种方法(更类似于原始方法)是使用共享内存缓冲区。有关详细信息,请参阅this answer。这个想法的问题是你需要使用自旋锁(以系统性能和功耗为代价,当然不能在单核系统上工作)或轮询(这既低效又不太适合时间敏感的操作。)

答案 1 :(得分:1)

PASSIVE_LEVEL并不稳定。访问注册表必须处于PASSIVE_LEVEL,因此如果驱动程序运行在更高的IRQL下,则无法直接访问。但是,您可以通过卸载到工作项来实现。通常不建议降低IRQL,因为它与操作系统的意图相矛盾。

您的协议确实听起来有点麻烦,并且直接进行应用驱动程序通信可能更可取。您可以在此处找到有关此内容的有用信息:http://msdn.microsoft.com/en-us/library/windows/hardware/ff554436(v=vs.85).aspx

答案 2 :(得分:0)

由于标注处于DISPATCH,您的处理必须在工作线程或DPC中完成,这将允许您使用ZwXXX。您应该进行反向回调以进行通信,这是一篇关于OSR的好文档。

我刚开始在世界粮食计划署周围开展工作,但即使在他们提供的样本中,微软也会重新注入数据包。我没有密切关注它,但似乎他们丢弃数据包并在处理时重新注入。这对于您的使用模式引擎来说就足够了。您还应该将数据包捕获限制在特定端口(在您的情况下为80),这样您就不需要进行额外的处理。