【问题标题】:File System Filter Driver: Creating a Defragmenter文件系统过滤器驱动程序:创建碎片整理程序
【发布时间】:2011-08-10 05:26:28
【问题描述】:

我刚刚开始研究文件系统过滤器驱动程序,该驱动程序监视对任何文件的 I/O 写入(侦听 IRP_MJ_WRITE 请求),并在文件碎片化时透明地对文件进行碎片整理。

目前,我有这样的代码:

NTSTATUS FsFilterDispatchWrite(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{
    PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
    NTSTATUS result = FsFilterDispatchPassThrough(DeviceObject, Irp);
    //FltFsControlFile(???);
    return result;
}

我需要在其中发出FSCTL_GET_RETRIEVAL_POINTERS I/O 控制代码。

但是,我对驱动程序开发领域还很陌生...FltFsControlFile 是否适合我在这里使用?如果是这样,Instance 参数代表什么?如果没有,那我该怎么做呢?

【问题讨论】:

  • 如果您对驱动程序开发比较陌生,您应该先学习一些较轻的东西。但是,如果您对旧版 FSFD 感兴趣,我建议您研究旧版 IFS 工具包中的 filespysfilter 示例,如果您可以将过滤器管理器作为先决条件,我建议您研究新版 FSFD 中的微过滤器示例。跨度>
  • @STATUS:好的,我去看看,谢谢。
  • @STATUS:我在哪里可以找到这些示例?我查看了 Windows 7 WDK 中的其他示例,但我认为这不是您所指的...
  • @Mehrdad:那个不再包括旧的 FSFD 示例。最好的开始是7600.16385.1\src\filesys\miniFilter\passThrough7600.16385.1\src\filesys\miniFilter\minispy,以了解他们所做的事情。如果您需要 IFS 工具包中的旧示例,请告诉我。我会看看旧的 WDK 是否有它,否则可能会为您上传 3790.1830 IFS 套件中的示例代码。
  • @STATUS:当然,我会告诉你的,非常感谢你的提议。 :-) 现在我遇到的问题是我尝试在虚拟机上编译和安装空过滤器示例,但是每当我启动驱动程序时,一切都会突然冻结并且 CPU 使用率飙升。知道会发生什么吗? (作为参考,我实际上是在使用 Visual Studio 的编译器(!)进行编译,但我不认为这会是一个问题,不是吗?我正在设置 /DRIVER:WDM 标志和来自 WDK 的正确库路径和一切,所以应该没问题...)

标签: filesystems kernel defragmentation nt filter-driver


【解决方案1】:

梅哈德,

FltFsControlFile 是正确使用的 API,但请记住,它不值得从过滤器驱动程序进行碎片整理,在内核模式下对 IO 路径(或从工作线程进行碎片整理将非常低效)非常高效。

Windows 使大多数文件可以在用户模式下进行碎片整理。检查http://technet.microsoft.com/en-us/library/dd405526(VS.85).asphttp://technet.microsoft.com/en-us/library/aa364577(VS.85).aspx

要监控 FS 活动,最好使用 USN 日志,这非常有效。不会对系统施加任何负载

http://technet.microsoft.com/en-us/library/aa365736(VS.85).aspx

【讨论】:

  • @Suresh:感谢您的确认。至于 USN 日志,问题在于它并不总是打开,而且我不喜欢打开它,因为它会碎片化并浪费磁盘空间(有时甚至接近千兆字节或更多)......所以这就是我在想的原因关于制作驱动程序。
  • @Mehrdad - 您可以做的其他事情是 rgister 获取目录更改通知,您将收到通知哪些文件已更改。您不必为此在 USN 上进行中继。 [链接]msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx
  • @Suresh:这种方法的问题是它可能会错过通知,并且当有很多通知时很可能会发生这种情况——这通常是碎片整理时的确切时间是最关键的。
  • @Merhrdad - 我不确定您是如何错过通知的。你能再解释一下吗?
  • @Suresh:看看herethis 可能会有所帮助:changes can be missed if your application isn’t running, or if the buffer supplied to ReadDirectoryChangesW overflows.
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多