0

我正在尝试从 MFT 中删除一个文件记录,如果我打开原始分区并通过解析 MFT 文件到达所需的文件记录,我会成功执行该记录。这种方法的问题是我必须先锁定卷,以便我可以在任何 MFT 文件记录上写入零,并且如果其他一些进程正在持有卷锁定(这很可能),由于 Windows 操作系统,写入原始卷失败限制。

我想到的另一种方法是将“$MFT”作为文件打开,然后对其进行读写。通过这种方式,我认为我不必锁定音量。但是当我尝试通过 createfile winapi 函数打开 $MFT 文件时,即使我以管理员身份运行我的程序,也会引发“访问被拒绝”错误?

我的问题是如何打开 $MFT 系统文件进行读写?windows操作系统是否允许系统文件以正常方式读写?如果没有,我还能做什么?

任何帮助,将不胜感激。

4

2 回答 2

4

以防万一有人来这里是$MFT为了一个合法目的而打开FSCTL_MOVE_FILEand ,您需要在第二个参数中指定 to何时打开特殊流,例如FSCTL_GET_RETRIEVAL_POINTERS DeviceIoControlFILE_READ_ATTRIBUTESCreateFileC:\$MFT::$DATA

打开$MFT只允许您在执行请求时引用特殊文件DeviceIoControl,它不会像普通文件那样打开它进行读写。

如果您真的想读取 MFT 内容,当您需要非常快速地获取卷上每个文件的列表时,请参阅FSCTL_ENUM_USN_DATA,它会返回类似 的结构USN_RECORD_V2,这些结构本质上是 MFT 记录。

于 2016-10-09T21:49:11.577 回答
2

用户模式程序无法访问 $MFT。(谢天谢地。)它由 NTFS 驱动程序维护,只有 NTFS 驱动程序知道如何使其保持最新。

对于您计划的实施,我建议直接使用文件系统,或实施文件系统过滤器驱动程序。有一个关于编写文件系统过滤驱动程序的教程,以及一些关于检测删除的指针。(和往常一样,有一些棘手的地方......)

于 2013-10-21T18:25:04.487 回答