(почему) является 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 [источник]