(почему) является FSCTL_SET_OBJECT_ID опасным?

Файлы NTFS могут иметь идентификаторы объектов. Эти идентификаторы можно установить с помощью FSCTL_SET_OBJECT_ID. Тем не менее, в статье msdn говорится:

Изменение идентификатора объекта может привести к потере данных из частей файла, вплоть до целых объемов данных.

Но это не более подробно. Как это может привести к потере данных? Это говорит о потенциальных столкновениях объектов в файловой системе, и NTFS полагается на них каким-то образом?

Side node: Я немного экспериментировал с этим, прежде чем обнаружил этот параграф и установил идентификатор объекта для некоторых вновь созданных файлов, надеясь, что моя файловая система все еще не повреждена.

Ответ 1

Я действительно не думаю, что это может привести к потере данных.

Единственный способ, которым я могу представить, что это возможно, - это, например, программа резервного копирования предполагает, что (1) каждый файл имеет идентификатор объекта и (2), что программа всегда отслеживает все идентификаторы. В этом случае он может предположить, что идентификатор, который не находится в его базе данных, должен ссылаться на файл, который не должен существовать, и он может удалить файл.

Да, я знаю, это звучит смешно, но это единственный способ, которым я могу думать, в котором это может произойти. Я не думаю, что вы можете потерять данные, просто изменив идентификаторы.

Ответ 2

Они используются службой отслеживания распределенной ссылки, которая позволяет клиентским приложениям отслеживать перемещенные источники ссылок. Служба отслеживания ссылок поддерживает ссылку на объект только с использованием этого идентификатора объекта (ID).

Итак, вернемся к вашему вопросу,

Это говорит о потенциальных столкновениях объектов в файловой системе

Я так не думаю. Windows предоставляет нам возможность устанавливать идентификаторы объектов с помощью FSCTL_SET_OBJECT_ID, но это не приводит к риску столкновения с идентификатором. Ошибка при попытке установить идентификатор объекта на объекте, у которого уже есть идентификатор объекта.

.. и NTFS полагается на них каким-то образом?

Да. Идентификаторы объектов используются для отслеживания файлов и каталогов. Индекс всех идентификаторов объектов хранится на томе. Операции переименования, резервного копирования и восстановления сохраняют идентификаторы объектов. Однако операции копирования не сохраняют идентификаторы объектов, поскольку это нарушает их уникальность.

Как это может привести к потере данных?

У вас не возникнет серьезная проблема, если вы измените (или скорее установили) идентификатор объекта созданных пользователем файлов (как и вы). Однако, если пользователь (сознательно/неосознанно) устанавливает идентификатор объекта, используемый файлом/библиотекой общего объекта, изменение не будет отображаться как есть.

Так как Windows не хочет, чтобы все (но разработчики) играли с файлами crutial library, он выдает общее предупреждение:

Изменение идентификатора объекта может привести к потере данных из части файла, вплоть до целых объемов данных.

Нижняя строка: измените ее, если вы знаете, что делаете.

Там еще другая msn статья об отслеживании распределенных ссылок и идентификаторах объектов.

Надеюсь, что это поможет!

ИЗМЕНИТЬ

Благодаря @Mehrdad для указания. Я не имел в виду объектные идентификаторы самих DLL, а те, которые они используют внутри.

OLEACC (dll) обеспечивает время выполнения Active Accessibility и управляет запросами от клиентов Active Accessibility [source]. Он использует идентификатор объекта OBJID_QUERYCLASSNAMEIDX [источник]