将文件内容从内核传递到用户模式的最快方法?

时间:2010-02-16 20:21:01

标签: windows filter kernel driver wdk

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

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

我是第一次编写内核模式驱动程序(KMD),在内核模式下没有任何经验。我现在正在玩DDK附带的“扫描仪”迷你过滤器样品,并在实践中进行扩展。 “扫描仪”迷你过滤器是通用“防病毒”类型扫描驱动程序的基本概要,其挂钩文件创建/关闭并在关联文件上操作以在批准/拒绝所请求的操作之前扫描“坏词”。

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

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

但是,我注意到与使用标准库(fstream)的C ++中的常规打开/读取相比,此过程似乎相当慢。在简单的C ++用户应用程序中,此方法比简化打开和读取文件的时间长大约4-8倍。我已经调整了缓冲区大小以确定它是否有明显的改进,虽然它可以略微提供帮助,但其好处似乎并不显着。

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

1 个答案:

答案 0 :(得分:4)

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

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