Windows如何将物理扇区更改或插入另一个文件?

时间:2017-06-03 18:50:17

标签: c++ c windows ntfs

我有20个文件,其中数据结构在NTFS中与4k扇区对齐。我希望将所有文件合并而不复制任何数据。 目标是编写一种插入API,通过直接更改NTFS虚拟群集和物理群集来工作。

目标是从50GB块中获取大小为1TB的文件而不进行复制。所有数据都已存在于磁盘上且位于同一卷上。 这可以通过直接在文件中设置NTFS逻辑集群来实现。

我可以使用 FSCTL_GET_RETRIEVAL_POINTERS

读取文件的虚拟到物理翻译

资料来源:VCN:0集群:16 LCN:54723798

目标:VCN:0集群:160 LCN:6172145

我尝试使用Windows Defrag API:

bool fResult = DeviceIoControl(
                hVol,
                FSCTL_MOVE_FILE,
                p,
                bufSize,
                NULL, 
                0,
                ref size,
                NULL);

虽然这是完美的命令,但它无法将源文件的物理地址更改为目标文件的物理地址: 的 STATUS_ACCESS_DENIED 即可。如果我删除目标文件,我可以移动物理群集,但目标文件已经消失。

NTFS硬链接会很好但我无法创建另一个文件的子部分的硬链接。

我在Windows机器上拥有管理员权限,我需要在文件系统级别上执行此操作,而不是使用Windows文件API,以避免任何复制。解决方案是通过直接写入NTFS主文件表来更改集群。

或者删除大文件,将20个文件的所有逻辑扇区更改为已删除的文件扇区,然后创建具有特定已存在扇区的文件。

工作解决方案会产生结果:

Source1:VCN:0 Cluster:16 LCN:54723798

Source2:VCN:0 Cluster:16 LCN:6172145

目标:

扩展2:

VCN:0群集:16 LCN:54723798

VCN:16集群:16 LCN:6172145

要验证更改,您可以以管理员身份运行cmd窗口:

fsutil volume filelayout“C:\ Data \ BigFile.txt”

欢迎更改或插入MFT条目的任何其他想法或某些C ++ / C代码。

更新1:我可以读取NTFS分区的MFT,但我真的需要知道如何创建或编辑文件条目的人。其他解决方案也欢迎

0 个答案:

没有答案