首页 文章

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

提问于
浏览
3

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

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

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

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

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

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

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

1 回答

  • 4

    我可以建议几个解决方案:

    • 使用带有METHOD_OUT_DIRECT传输类型的DeviceIoControl传递大量数据 .

    • 创建内存部分并将其映射到您的进程(请记住32位平台上有限的地址空间) .

    • 将文件路径传递给应用程序并在那里打开它 .

相关问题