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

我会尽量简短,但充分描述:

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

我是第一次编写内核模式驱动程序(KMD),在内核模式方面没有任何经验。 目前,我正在使用DDK附带的“扫描仪”微型filter样品,并将其扩展到实践中。 “扫描仪”微型filter是一个通用的“防病毒”型扫描驱动程序的基本概要,该驱动程序钩住文件创build/closures并在相关文件上运行,以在批准/拒绝请求的操作之前扫描“坏字”。

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

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

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

由于我正在寻找“实时”扫描文件,所以这种传输速率非常令人失望和令人望而却步。 有没有更快的方式将文件内容从内核模式驱动程序传输到用户模式应用程序?

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

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