我将尽量简短,但完整的描述性:
这是特定于Windows的。使用Windows驱动程序开发工具包(DDK)。
我是第一次编写内核模式驱动程序(KMD),之前没有使用内核模式的经验。我目前正在使用DDK附带的"scanner“微型过滤器示例,并在此基础上进行扩展以进行实践。"scanner“微型过滤器是通用”反病毒“类型扫描驱动程序的基本轮廓,它挂钩文件创建/关闭,并在相关文件上操作,以便在批准/拒绝所请求的操作之前扫描”坏字“。
最终目标是在打开文件时使用用户模式应用程序扫描文件,确定微型过滤器是否应允许操作完成,而不会明显减慢试图打开文件的进程或用户的速度。当尝试保存时,我还希望再次扫描整个文件,以确定是允许保存成功完成还是拒绝保存。mini-filter示例为如何挂钩这些调用奠定了基础,但在实际的“扫描”部分略显薄弱。
我正在考虑扩展样本以扫描已打开的整个文件,例如生成散列,而不仅仅是第一个1k (样本的限制)。我已经修改了示例,以读取整个文件,并使用原始示例中的相同机制发送它。此方法使用FltReadFile读取KMD中的文件,并使用FltSendMessage将缓冲区发送到用户模式组件。用户模式应用程序使用GetQueuedCompletionStatus从KMD获取通知并处理缓冲区。
然而,我注意到,与使用标准库(fstream)在C++中正常打开/读取相比,这个过程似乎相当慢。这种方法比在简单的C++用户应用程序中打开和读取文件所需的时间大约长4-8倍。我已经调整了缓冲区大小,看看它是否能带来显著的改进,虽然它可以稍微有所帮助,但好处似乎并不是非常显著。
由于我希望“实时”扫描文件,这种传输速度非常令人失望和令人望而却步。有没有更快的方法将文件内容从内核模式驱动程序传输到用户模式应用程序?
发布于 2010-02-17 17:34:36
我可以建议几个解决方案:
https://stackoverflow.com/questions/2276044
复制相似问题