我正在尝试从MFT中删除文件记录,如果我打开原始分区并通过解析MFT文件到达所需的文件记录,我正在成功。这种方法的问题是我必须首先锁定卷,以便我可以在任何MFT文件记录上写入零,如果某个其他进程持有卷锁(这非常非常可能),由于Windows操作系统,写入原始卷失败限制。
我想到的另一种方法是将“$ MFT”作为文件打开然后读写它。通过这种方式我认为我不必锁定音量。但是当我尝试通过createfile winapi函数打开$ MFT文件时,即使我以管理员身份运行程序,也会出现“拒绝访问”错误?
我的问题是如何打开$ MFT系统文件进行写入和读取? Windows OS是否允许系统文件以正常方式读写?如果没有,我还能做什么?
任何帮助都将不胜感激。
答案 0 :(得分:2)
如果某人为了一个合法目的(FSCTL_MOVE_FILE
和FSCTL_GET_RETRIEVAL_POINTERS
DeviceIoControl
而来到这里寻找开放$MFT
,您需要指定FILE_READ_ATTRIBUTES
在打开CreateFile
C:\$MFT::$DATA
的第二个参数中
打开$MFT
只允许您在执行DeviceIoControl
请求时引用特殊文件,它不会像普通文件一样打开它进行读写。
如果您真的想要阅读MFT内容,当您需要非常快速地获取卷上每个文件的列表时,请参阅FSCTL_ENUM_USN_DATA
,它会返回USN_RECORD_V2
之类的结构,这些结构基本上是MFT记录。
答案 1 :(得分:1)
无法从用户模式程序访问$ MFT。 (感谢上帝。)它由NTFS驱动程序维护,仅NTFS驱动程序知道如何使其保持最新。
对于您计划的实施,我建议您直接使用文件系统,或实施file system filter driver。有一个tutorial on writing a file system filter driver,还有一些pointers on detecting deletions。 (一如既往,有一些棘手的问题......)