4

我会尽量简短,但完全描述性:

这是特定于 Windows 的。使用 Windows 驱动程序开发工具包 (DDK)。

我是第一次编写内核模式驱动程序 (KMD),之前没有内核模式方面的经验。我目前正在使用 DDK 附带的“扫描仪”微型过滤器示例,并对其进行扩展以进行练习。“扫描仪”微型过滤器是通用“防病毒”类型扫描驱动程序的基本概述,它挂钩文件创建/关闭并对关联文件进行操作以在批准/拒绝请求的操作之前扫描“坏词”。

最终目标是在打开文件时使用用户模式应用程序扫描文件,确定微过滤器是否应允许操作完成,而不会明显减慢尝试打开文件的进程或用户。文件。当尝试保存以决定是允许保存成功完成还是拒绝保存时,我还想再次扫描整个文件。微型过滤器示例为如何挂钩这些调用奠定了基础,但在实际“扫描”部分中有点弱。

我正在考虑扩展示例以扫描已打开的整个文件,例如生成哈希,而不仅仅是前 1k(示例的限制)。我已修改示例以读取整个文件并使用原始示例中的相同机制发送它。此方法用于FltReadFile读取 KMD 中的文件FltSendMessage并将缓冲区发送到用户模式组件。用户模式应用程序GetQueuedCompletionStatus用于从 KMD 获取通知并处理缓冲区。

但是,我注意到与使用标准库(fstream)在 C++ 中正常打开/读取相比,这个过程似乎相当慢。与在简单的 C++ 用户应用程序中简单地打开和读取文件相比,此方法花费的时间大约要长 4-8 倍。我已经调整了缓冲区大小,看看它是否有显着的改进,虽然它可以稍微有所帮助,但好​​处似乎并不是很显着。

由于我希望“实时”扫描文件,因此这种传输速度非常令人失望且令人望而却步。有没有更快的方法将文件内容从内核模式驱动程序传输到用户模式应用程序?

4

1 回答 1

4

我可以提出几个解决方案:

  1. 使用具有 METHOD_OUT_DIRECT 传输类型的 DeviceIoControl 来传递大量数据。
  2. 创建内存部分并将其映射到您的进程(请记住 32 位平台上的有限地址空间)。
  3. 将文件路径传递给您的应用程序并在那里打开它。
于 2010-02-17T09:34:36.300 回答