Tag: ntfs

即使以管理员身份运行,打开$ MFT文件也会导致访问被拒绝

我试图从MFT中删除文件记录,如果我打开原始分区并通过解析MFT文件到达所需的文件记录,我正在成功。 这种方法的问题是我必须首先锁定卷,以便我可以在任何MFT文件记录上写零,如果某个其他进程持有卷锁(非常非常可能),由于Windows操作系统,写入原始卷失败限制。 我想到的另一种方法是将“$ MFT”作为文件打开然后读写它。 通过这种方式我认为我不必锁定音量。 但是当我尝试通过createfile winapi函数打开$ MFT文件时,即使我以管理员身份运行程序,也会出现“拒绝访问”错误? 我的问题是如何打开$ MFT系统文件进行写入和读取? Windows OS是否允许系统文件以正常方式读写? 如果没有,我还能做什么? 任何帮助,将不胜感激。

根据磁盘ID删除文件

如此处所述,使用带有FILE_DISPOSITION_INFO允许设置具有打开句柄的文件,以便在关闭所有句柄时删除该文件。 但是,我试图根据文件索引(磁盘ID)删除文件,该文件由FILE_DISPOSITION_INFO和OpenFileById检索,以便安全地删除目录中只有大小写不同的文件/目录。 这在我的用例中是安全的,因为在NTFS系统上,文件索引在删除之前是持久的 ,否定当前代码库处理的ReplaceFile的使用。 但是,在尝试删除句柄时,我收到错误87( ERROR_INVALID_PARAMETER )。 如果我使用CreateFileW创建的句柄删除,我没有遇到任何问题。 但是,我无法做到这一点,因为Windows无法区分同一案例的两个文件/文件夹,即使NTFS可以。 我也知道,使用OpenFileById打开的硬链接文件存在歧义,因为硬链接文件共享相同的磁盘ID。 可以认为硬链接文件的问题与此方案无关。 我只会按ID删除目录,不能硬链接。 我的OpenFileById调用中是否缺少参数或设置? 不知何故,在我的SetFileInformationByHandle调用? 我试过的其他方法: 使用OpenFileById句柄调用DuplicateHandle ,为dwDesiredAccess提供DELETE ,并使用它。 相同的ERROR_INVALID_PARAMETER结果。 将ReOpenFile与OpenFileById句柄dwDesiredAccess使用,为dwDesiredAccess提供DELETE ,并使用它。 相同的ERROR_INVALID_PARAMETER结果。 将ReOpenFile与OpenFileById句柄一起使用,为dwDesiredAccess提供DELETE ,并提供FILE_FLAG_DELETE_ON_CLOSE标志。 没有给出错误,但在关闭所有句柄后文件仍然存在。 这是一个最小但完整的例子,它可以重现这个问题: #include #include #include DWORD getFileID(LPCWSTR path, LARGE_INTEGER *id) { HANDLE h = CreateFileW(path, 0, 0, 0, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS, 0); if (h == INVALID_HANDLE_VALUE) return GetLastError(); […]