我会尽量简短但完整地描述:
这是特定于 Windows 的。使用 Windows 驱动程序开发工具包 (DDK)。
我是第一次编写内核模式驱动程序 (KMD),之前没有任何内核模式经验。我目前正在使用 DDK 附带的“扫描仪”微型过滤器示例,并在其上进行扩展以进行练习。 “扫描器”微型过滤器是通用“反病毒”类型扫描驱动程序的基本轮廓,它 Hook 文件创建/关闭并对关联文件进行操作以在批准/拒绝请求的操作之前扫描“坏词”。
最终目标是在打开文件时用用户模式应用程序扫描文件,决定微型过滤器是否应该允许操作完成,而不会对正在尝试的进程或用户造成明显的减慢打开文件。当尝试保存时,我还想再次扫描整个文件,以决定是允许保存成功完成还是拒绝保存。微型过滤器示例为如何挂接这些调用奠定了基础,但在实际“扫描”部分中有点薄弱。
我正在考虑扩展示例以扫描已打开的整个文件,例如生成哈希,而不仅仅是前 1k(示例的限制)。我修改了样本以读取整个文件并使用原始样本中的相同机制发送它。此方法使用 FltReadFile
读取 KMD 中的文件,并使用 FltSendMessage
将缓冲区发送到用户模式组件。用户模式应用程序正在使用 GetQueuedCompletionStatus
从 KMD 获取通知并处理缓冲区。
但是,我注意到与使用标准库 (fstream) 在 C++ 中正常打开/读取相比,这个过程似乎相当慢。与在简单的 C++ 用户应用程序中简单地打开和读取文件相比,此方法花费的时间大约为 4-8 倍。我已经调整了缓冲区大小,看看它是否能带来显着的改进,虽然它可以提供轻微的帮助,但好处似乎并不十分显着。
由于我希望“实时”扫描文件,因此这种传输速度非常令人失望且令人望而却步。有没有更快的方法将文件内容从内核模式驱动程序传输到用户模式应用程序?
最佳答案
我可以提出几个解决方案:
- 使用 DeviceIoControl 和 METHOD_OUT_DIRECT 传输类型来传递大量数据。
- 创建内存部分并将其映射到您的进程(记住 32 位平台上的地址空间有限)。
- 将文件路径传递给您的应用程序并在那里打开它。
关于windows - 将文件内容从内核模式传递到用户模式的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2276044/