(为什么)FSCTL_SET_OBJECT_ID是危险的?

sim*_*ack 10 windows filesystems ntfs

NTFS文件可以包含对象ID.可以使用这些ID进行设置FSCTL_SET_OBJECT_ID.但是,msdn文章说:

修改对象标识符可能导致文件部分丢失数据,直至并包括整个数据量.

但它没有详细说明.这怎么会导致数据丢失?它是在讨论文件系统中潜在的对象id冲突吗?NTFS是否以某种方式依赖它们?

侧节点:我在找到该段落之前做了一些实验,并设置了一些新创建的文件的对象id,这里希望我的文件系统仍然完好无损.

nal*_*inc 0

它们由分布式链接跟踪服务使用,该服务使客户端应用程序能够跟踪已移动的链接源。链接跟踪服务仅通过使用这些对象标识符 (ID) 来维护其与对象的链接。

那么回到你的问题,

它是在谈论文件系统中潜在的对象 ID 冲突吗?

我不这么认为。Windows 确实为我们提供了使用 FSCTL_SET_OBJECT_ID 设置对象 ID 的选项,但这不会带来 ID 冲突的风险。 尝试在已经具有对象标识符的对象上设置对象标识符将会失败。

.. NTFS 是否以某种方式依赖它们?

是的。对象标识符用于跟踪文件和目录。所有对象 ID 的索引都存储在卷上。重命名、备份和恢复操作会保留对象 ID。但是,复制操作不会保留对象 ID,因为这会违反它们的唯一性。

这怎么会导致数据丢失呢?

如果您更改(或更确切地说设置)用户创建的文件的对象 ID(就像您所做的那样),您不会遇到严重的问题。但是,如果用户(有意/无意)设置共享对象文件/库使用的对象 ID,则更改将不会按原样反映。

由于 Windows 不希望每个人(除了开发人员)都使用重要的库文件,因此它会发出通用警告:

修改对象标识符可能会导致文件部分数据丢失,直至并包括整个数据卷。

底线:如果你知道自己在做什么,就改变它。

还有另一篇关于分布式链接跟踪和对象标识符的msn文章。

希望能帮助到你!

编辑

感谢@Mehrdad 指出。我的意思不是 DLL 本身的对象标识符,而是它们内部使用的对象标识符。

OLEACC(一个 dll),提供 Active Accessibility 运行时并管理来自 Active Accessibility 客户端的请求[来源]。它使用 OBJID_QUERYCLASSNAMEIDX 对象标识符 [来源]

  • 问题是我没有看到这篇文章提到任何有关 DLL 文件的内容...并且我从未听说过有人使用对象 ID 来引用 DLL 文件。(尤其是 hal.dll?你知道这个例子有多糟糕吗?HAL 在所有这些链接内容开始进入图片之前就已经加载了......) (2认同)