1

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

4

3 回答 3

2

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

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

如果您正在使用ReadFile或等效,事情通常会变得有点混乱,但在这种特定情况下,您只有两种操作,其中一种是读取(驱动程序->应用程序),另一种是写入(应用程序->驱动程序)。因此,您可以只使用WriteFile发送回复,当然包括 GUID,以便驱动程序可以将您的回复与正确的查询相匹配。

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

于 2012-12-31T10:36:42.470 回答
1

PASSIVE_LEVEL 没有什么不稳定的地方。对注册表的访问必须处于 PASSIVE_LEVEL,因此如果驱动程序以更高的 IRQL 运行,则无法直接访问。不过,您可以通过卸载到工作项来做到这一点。通常不建议降低 IRQL,因为它与操作系统的意图相矛盾。

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

于 2012-12-28T20:57:17.437 回答
0

由于标注在 DISPATCH 中,您的处理必须在工作线程或 DPC 中完成,这将允许您使用 ZwXXX。您应该出于通信目的使用反向回调,OSR 上有一个很好的文档。

我刚刚开始研究 WFP,但看起来即使在他们提供的示例中,Microsoft 也会重新注入数据包。我没有仔细研究它,但似乎他们丢弃数据包并在处理时重新注入。这足以让您的使用模式引擎做出决定。您还应该将数据包捕获限制在特定端口(在您的情况下为 80),这样您就不会进行不需要的额外处理。

于 2017-12-01T23:42:01.813 回答