【问题标题】:how to force windows FAT32 driver to reload FAT table?如何强制 Windows FAT32 驱动程序重新加载 FAT 表?
【发布时间】:2011-07-06 04:08:34
【问题描述】:

我正在实现自定义 Windows 磁盘驱动程序,并且需要 FAT32 Windows 驱动程序重新加载它 FAT 表 1 和 2,即在数据扇区下方。 如何做到这一点?

我需要更快的方法而不卸载驱动器。为什么我这样做是因为磁盘是内存虚拟磁盘,并且数据是在访问扇区的过程中从网络获取的。我正在即时写入目录数据,它可以工作,但不适用于文件 - 因为有时驱动程序会获取 FAT - 集群是免费的,所以文件不起作用。我对fastfat.sys进行了反汇编,发现了一些要点……至少我找到了可能会重新加载fat table的设备ioctl代码,如果我成功了,我会在这里发布。

【问题讨论】:

  • 反汇编是否显示了源代码中未包含的信息? (我没有尝试编译任何包含在 WDK 中的版本,所以我不知道这个问题的答案。)
  • FAT 没有官方源代码,但是 linux 有他们的实现,源代码可用。目前我只对 ioctl 代码感兴趣,因为没有其他可能的方式向驱动程序发送信号。
  • 这是官方源代码中发布的声明,虽然它不是ioctl:#define FatAcquireExclusiveVolume(IRPCONTEXT,VCB) { \ PFCB Fcb = NULL; \断言(标志((IRPCONTEXT)->标志,IRP_CONTEXT_FLAG_WAIT)); \ (VOID)FatAcquireExclusiveVcb( (IRPCONTEXT), (VCB) ); \ while ( (Fcb = FatGetNextFcbBottomUp((IRPCONTEXT), Fcb, (VCB)->RootDcb)) != NULL) { \ (VOID)FatAcquireExclusiveFcb((IRPCONTEXT), Fcb ); \ } \ }
  • 嘿,你在哪里找到的?请问能给个链接吗

标签: c++ windows driver fat32


【解决方案1】:

强制卸载卷并重新安装,或假装移除设备。

另外,您为什么要这样做?如果您尝试与操作系统同时写入文件系统,这几乎肯定是不安全的。

【讨论】:

  • 是的,我知道安装/拆卸,这会起作用,但我需要更快的方法而不卸载驱动器。为什么我这样做是因为磁盘是内存虚拟磁盘,并且数据是在访问扇区的过程中从网络获取的。我正在即时写入目录数据,它可以工作,但不适用于文件 - 因为有时驱动程序会获取 FAT - 集群是免费的,所以文件不起作用。我对fastfat.sys进行了反汇编,发现了一些要点……至少我找到了可能会重新加载fat table的设备ioctl代码,如果我成功了,我会在这里发布。
  • 这是一个非常糟糕的主意。请不要将此方法实际发送给任何人。如果在下一个服务包中,该设备 IOCTL 从“重新加载 FAT 表”更改为“清除扇区”或导致 BSOD 怎么办?我认为您需要提高抽象级别 - 大多数人创建一个远程文件系统来执行您正在做的事情(例如 SMB 或 WebDAV)
  • 这在未来是不可能的,所有像标准函数一样的ioctl代码都是向后兼容的。我正在做的网络文件系统,但存储源不是公开可用的服务。
  • 已记录 IOCTL/FSCTL 代码是向后兼容的,但是如果您通过反汇编挖掘未记录的代码,那么即使在修补程序之间,也绝对零保证它会起作用。你在写什么样的驱动程序?我是说你应该编写一个 RFS 驱动程序,它会像文件系统一样响应并通过网络进行通信,不涉及块级设备
  • 您可以做的另一件事是在用户模式下编写自定义 iSCSI 目标,然后使用 iSCSI 启动器 API 安装磁盘。您可能可以通过这种方式更快地执行卸载/重新安装循环,并且您的代码将更容易调试,因为您的目标只是在用户空间中通过 TCP 进行通信。
【解决方案2】:

您应该(嗯,必须,真的)卸载驱动器对 FAT 进行任何直接更改,然后再次安装到加载这些更改。否则,您可能会冒操作系统覆盖您使用其(旧)内存中表副本所做的离线更改的风险,可能会损坏您的文件系统而无法修复。

【讨论】:

  • 即使您可以说服上层“重新加载自己”,也没有明智的方法来执行此操作,因为磁盘缓存可能在内存中有一个陈旧的扇区恰好有一个 FAT 表它,它没有办法告诉你在背后改变了事情。
  • @tylerl,我知道安装/拆卸,这会起作用,但我需要更快的方法而不卸载驱动器。为什么我这样做是因为磁盘是内存虚拟磁盘,并且数据是在访问扇区的过程中从网络获取的。我正在即时写入目录数据,它可以工作,但不适用于文件 - 因为有时驱动程序会获取 FAT - 集群是免费的,所以文件不起作用。我对fastfat.sys进行了反汇编,发现了一些要点……至少我找到了可能会重新加载fat table的设备ioctl代码,如果我成功了,我会在这里发布。
【解决方案3】:

您可以从使用参数 FSCTL_LOCK_VOLUME 调用 DeviceIoControl 开始。如果它失败,那么您可以确定您最好不要自己修改 FAT,因为其他句柄在分区的某处打开。

下一个问题是当 FSCTL_LOCK_VOLUME 成功时该怎么做。两个人说要卸载卷,但这还不够。您必须使卷脱机,IOCTL_VOLUME_OFFLINE。但是当我尝试时,它仍然是不够的。 Windows 仍然在某处缓冲了一些东西。

【讨论】:

  • 我反汇编了 fastfat.sys 并发现了一些要点...至少我找到了可能会重新加载胖表的设备 ioctl 代码,如果我成功了,我会在这里发布。
猜你喜欢
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多