c - 如何在ntfs中为文件创建标准信息属性

标签 c

我有一个用NTFS格式化的USB。我需要使用'C'创建一个文件,所以我想知道


阅读$ BITMAP后如何为我的文件分配免费条目
mft文件的属性。
如何创建属性($ STANDARD
信息和$ FILENAME属性)。

最佳答案

因此,我意识到自己参加聚会已经晚了几年,但实际上成功完成了这样的工作,我将为我提供有用的服务。

flatcap - NTFS Documentation
 ->这是我找到的除File System Forensics Analysis by Brian Carrier以外的最佳文档

我正在执行的操作与您正在尝试执行的操作之间的最大区别是,我正在重构已删除的文件而不创建新文件。因此,我的主要优势是能够使用经过细微改动的复制属性。这是我的一些发现。

新文件记录需要$ Standard_Information(0x10)$ Filename(0x30)$ Security_Descriptor(0x50)和$ Data(0x80)属性。如果您在$ Secure系统文件中建立索引,则无需使用Security_Descriptor就可以摆脱困境,但是我建议使用$ Security_Descriptor来实现向后兼容和简化,这也是linux ntfs-3g的工作方式(我从观察ntfs-中学到了很多东西3g使用git的difftool对文件系统的部分进行了更改。您可以只复制示例文件中具有所需权限的$ Security_Descriptor。您也可以从类似的文件中复制其他属性的基本结构,并进行以下更改:


$ Standard_Information和$ Filename需要新的时间戳。您还需要更新父目录的文件记录中的File Alterted和MFT Alterted $ Standard_Information时间戳(中间2个),并且所有这些时间戳都应匹配。
$ Data很简单。您只需确保指定了正确的数据长度(如果驻留),如果非驻留,则需要读取从flatcap运行的数据中的大部分数据。
$ Filename应该只需要一个新的名称长度和属性长度即可匹配新名称。
如果文件记录是全新的,则需要为文件记录头(前24个字节左右)提供正确的文件记录大小,并填充到8字节边界,并且seq数为1(否则,文件记录头应为1)正在重新分配)。
极其重要的是,每当更新具有USN(文件和索引记录)的任何内容时,都必须对其进行更新,并将每个扇区的末尾与USN交换并进入“更新序列数组”。我不确定应该增加多少,但是我编写了代码,为每个已写入且似乎有效的扇区增加了它。


您将需要阅读索引记录,以便将文件正确放置在父目录中:


确保将新文件的相应索引条目键插入正确的索引记录或目录B * tree的节点中。
索引记录USN需要更新,其长度和自引用键中的时间戳也需要更新。


关于处理$ MFT的$ Bitmap属性。我对NTFS如何做到这一点并不满意,在我了解更多信息时会更新,但这就是我所做的。重要的是要认识到NTFS具有低编号的文件记录的MFT储备,除非卷承受压力,否则该文件记录将不被写入,并且如果写入错误的记录窗口将发现您的新文件已损坏。


您不需要更新USN
每一位代表一个文件记录。
找到最后一个(而不是第一个)完整文件记录,然后选择第一个空文件。
填写该位,并在新文件的索引条目表示中记录MFT文件参考地址。
将新文件记录写入该位置。


MFT文件参考地址是一个48位文件参考号(您在$ Bitmap中找到)的混合物,它只是$ MFT中记录的索引(0是第一条记录,等等)和16位序列号(可以通过首先解析$ MFT文件记录的$ Data属性,然后逐个计数记录直到达到该编号,来使用文件参考号查找任何文件记录(显然,您不会实际上,您需要通过一些简单的数学运算来对它们进行逐一计数,但是当您阅读“数据运行”时,我觉得如何做将变得更加清晰。

我可能忘记了很多东西,但是我希望有人在我开始研究时就把其中的一些记下来,因为那样的话,我的生活可能会变得最轻松一些。

关于c - 如何在ntfs中为文件创建标准信息属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14472433/

相关文章:

c - 对主要问题的 undefined reference

c - 函数声明中不熟悉的 C 语法

在 C 中创建线程

C-ares 获取 ns 记录

C 检测空行

c - 如何从 c 头文件中提取函数原型(prototype)以实现自动完成功能

c - 而 C 中的 EOF

c - OpenCV cvReleaseMat 内存分配错误

c - Linux 内核字符设备驱动程序向用户空间返回空字符串

c - AM335x FreeRTOS 端口,无法处理 IRQ 和 SWI