Filesystems 文件系统筛选器驱动程序:创建碎片整理程序

Filesystems 文件系统筛选器驱动程序:创建碎片整理程序,filesystems,kernel,defragmentation,nt,filter-driver,Filesystems,Kernel,Defragmentation,Nt,Filter Driver,我刚刚开始开发一个文件系统过滤器驱动程序,它监视对任何文件的I/O写入(侦听IRP\u MJ\u WRITE请求),并在文件碎片化时透明地对其进行碎片整理 目前,我有如下代码: NTSTATUS FsFilterDispatchWrite(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp) { PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject

我刚刚开始开发一个文件系统过滤器驱动程序,它监视对任何文件的I/O写入(侦听
IRP\u MJ\u 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\u GET\u RETRIEVAL\u指针
I/O控制代码

但是,我对驱动程序开发领域还比较陌生。。。
FltFsControlFile
是我在这里使用的正确函数吗?如果是,那么
实例
参数代表什么?如果没有,那我该怎么做呢

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

Windows使大多数文件可以从用户模式进行碎片整理。检查和

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


如果您对驱动程序开发相当陌生,您应该先学习一些较轻的东西。但是,如果您对旧版FSFD感兴趣,我建议您学习旧版IFS工具包中的
filespy
sfilter
示例,如果您愿意将过滤器管理器作为先决条件,我建议您学习新版本中的minifilter示例。@状态:好的,我会看一看,谢谢。@STATUS:我在哪里可以找到这些示例?我看了一下Windows7WDK中的其他示例,但我认为这不是您所指的…@Mehrdad:这一个不再包括遗留的FSFD示例。最好的开始是
7600.16385.1\src\filesys\minipilter\passThrough
7600.16385.1\src\filesys\minipilter\minipy
,以了解它们的功能。如果您需要IFS工具包中的旧示例,请告诉我。我将查看旧版WDK是否有此功能,否则可能会为您上载3790.1830 IFS工具包中的示例代码。@状态:当然,我会告诉您的,非常感谢您的帮助。:-)现在我遇到的问题是,我尝试在虚拟机上编译并安装空过滤器示例,但每当我启动驱动程序时,所有内容都会突然冻结,CPU使用率会急剧上升。知道会发生什么吗?(作为参考,我实际上是使用Visual Studio的编译器(!)进行编译的,但我不认为这会是一个问题,对吗?我正在设置
/DRIVER:WDM
标志以及来自WDK的正确库路径和所有内容,所以应该可以…@Suresh:谢谢您的确认。至于USN日志,问题是它并不总是打开,我不喜欢打开它,因为它会变得支离破碎并浪费磁盘空间(有时甚至接近1 GB或更多)。。。所以这就是为什么我在考虑制作一个驱动程序。@Mehrdad-你可以做的另一件事是注册一个direcotry更改通知,你会收到文件更改的通知。你不必依赖USN。[链接]@Suresh:这种方法的问题是它可能会错过通知,而当有很多通知时,这种情况就很可能发生——通常是碎片整理最关键的时候。@Merhrdad-我不确定你怎么会错过通知。您能再解释一下吗?@Suresh:看一看可能会有所帮助:
如果您的应用程序没有运行,或者如果提供给ReadDirectoryChangesW的缓冲区溢出,更改可能会丢失。