swapbuffers minifilter问题

时间:2015-11-02 19:01:13

标签: driver minifilter

我使用swapbuffers示例实现了一个minifilter驱动程序。我做了两处修改:

  • 仅附加到\ Device \ HarddiskVolume3
  • 加密XORing with 0xFF

加密有效,但是volume3(在我的系统中是E :)不起作用。 E:无法识别文件系统。 chkdsk E:导致所有引导扇区损坏的消息。

调查后(使用procmon.exe):chkdsk.exe创建卷的卷影副本。如果驱动程序也附加了卷影副本,chkdsk E:就可以了,那么文件系统就是完美的。但E:仍未被承认。

知道我应该改变什么吗?

1 个答案:

答案 0 :(得分:0)

假设没有发生任何简单的错误,即已卸载卷,您添加了过滤器,并重新安装,显然mount / filesystem没有使用您的过滤器。

我注意到示例代码中有关“不适用于内核模式驱动程序”的注释。

您想要研究的是“整盘加密”。谷歌搜索和搜索:windows whole disk encryption将有所帮助。

特别是,TrueCrypt可以满足您的需求。由于它是开源的,并且可以在sourceforge.net上找到,因此您可以下载源代码并通过了解TrueCrypt如何处理来解决您的问题。

只有一个问题:TrueCrypt存在安全漏洞,因此sourceforge.net页面现在只是迁移信息BitLocker。但是,它仍然存在,并且已经创建了其他页面,您可以在其中获得它。值得注意的是,TrueCrypt的分叉是VeraCrypt

搜索中的其中一个页面是:http://www.howtogeek.com/203708/3-alternatives-to-the-now-defunct-truecrypt-for-your-encryption-needs/

<强>更新

注意:在我写完这个更新后,我意识到可能有希望......所以,继续阅读。

Minifilter 出现以用于文件系统,但不用于底层存储。它可以工作,你只需要找到一个较低级别的钩子。滤镜堆altitute怎么样?这是一个链接:https://msdn.microsoft.com/en-us/library/windows/hardware/ff540402%28v=vs.85%29.aspx它还包含fltmc!fltkd调试程序扩展

的文档

在这篇[简短]博客中:http://blogs.msdn.com/b/erick/archive/2006/03/27/562257.aspx它说:

  

过滤器管理器旨在为驱动程序创建一个简单的机制来过滤文件系统操作:文件系统minifilter驱动程序。文件系统minifilter驱动程序位于I / O管理器和基本文件系统之间,而不是文件系统和传统文件系统筛选器驱动程序之类的存储驱动程序之间。

弄清楚这意味着什么会有所帮助。 FS和I / O管理器[我不知道]之间的挂钩点是否足够?或者,您是否需要在文件系统和存储驱动程序之间挂钩[暗示传统过滤器]?

我怀疑,如果minifilter没有可以做同样事情的东西,那么“遗留”驱动程序过滤器可能就是你所需要的。

由于您的挂钩需要处理已卸载的存储,以便chkdsk能够正常工作,这可能意味着旧版过滤器。另一方面,你提到你能够挂钩阴影副本,它适用于chkdsk。这意味着minifilter有正确的东西。

这是一个我认为更具信息性的链接:http://blogs.msdn.com/b/ntdebugging/archive/2013/03/25/understanding-file-system-minifilter-and-legacy-filter-load-order.aspx它有一个关于加密过滤器的altitute的直接示例。你可能需要更多的钩点并降低你的微过滤器的高度

更新#2

Swapbuffers只是挂了几件事:IRP_MJ_READIRP_MJ_WRITEIRP_MJ_DIRECTORY_CONTROL。这些是与文件I / O相关的,而不是与设备I / O相关的。这个例子很好,不一定适合你的目的。

我给你fltmc的链接是MS过滤器的完整参考文件中的一页。如果你徘徊,你会发现更有趣的事情,如IoGetDeviceAttachmentBaseRefIoGetDiskDeviceObject。您需要找到设备的对象并过滤其I / O操作。

我认为除了示例之外,您还必须阅读参考资料。正如我之前所说,过滤器需要挂钩更多或不同的东西。

在VeraCrypt源代码中,Driver子目录是您可能需要执行的操作类型的示例。在DriveFilter.c中,它使用IRP_MJ_READ,但也使用IRP_MN_START_DEVICE [设备启动时的挂钩]。

说真的,这可能比你想象的还要多。这只是为了好玩,还是仅仅是一个更大项目的测试案例?