(为什么)FSCTL_SET_OBJECT_ID是危险的?

时间:2015-01-09 23:20:13

标签: windows filesystems ntfs

NTFS文件可以包含对象ID。可以使用FSCTL_SET_OBJECT_ID设置这些ID。但是,msdn article说:

  

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

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

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

2 个答案:

答案 0 :(得分:1)

我真的不认为这会直接导致数据丢失。

我能想象的唯一方法是,例如备份程序假设(1)每个文件都有一个Object Id,(2)程序始终跟踪所有ID。在这种情况下,它可能会假定不在其数据库中的ID必须引用不应存在的文件,并且可能会删除该文件。

是的,我知道这听起来很荒谬,但这是我能想到的唯一可能发生这种情况的方法。我不认为只是通过更改ID就会丢失数据。

答案 1 :(得分:0)

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

回到你的问题,

  

是否在讨论文件系统中潜在的对象ID冲突   ?

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

  

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

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

  

这怎么会导致数据丢失?

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

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

  

修改对象标识符可能会导致数据丢失   文件的一部分,包括整个数据量。

底线:如果您知道自己在做什么,请更改它。

在分布式链接跟踪和对象标识符上还有另一个msn article

希望它有所帮助!

修改

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

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