Пытаюсь создать атрибут Object Id у файла на NTFS.
У этого файла в момент создания такого атрибута нет.
Предварительно получаю привилегии
SE_BACKUP_PRIVILEGE и SE_RESTORE_PRIVILEGE.
Файл открыт так:
hNew = CreateFile("filename", GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
Делаю так:
if (!DeviceIoControl(hNew, FSCTL_SET_OBJECT_ID,
pObj, sizeof(OBJECTID_ATTRIBUTE), NULL, 0, &dwRet, NULL))
{
PrintWin32Error();
CloseHandle(hNew);
return FALSE;
}
pObj — указатель на OBJECTID_ATTRIBUTE (64 байт).
Всё время получаю ошибку access denied, ничего не создаётся.
FSCTL_CREATE_OR_GET_OBJECT_ID работает, но там система сама генерирует содержимое,
мне не подходит, хочу задать полностью своё содержимое буфера.
FSCTL_SET_OBJECT_ID_EXTENDED — не подходит, так как задаёт только 48 байт, а
первый идентификатор оставляет неизменным.
FSCTL_DELETE_OBJECT_ID — удаляет существующий Object Id, если у файла он есть.
Судя по MSDN для его вызова нужны точно такие же привилегии, как и для вызова FSCTL_SET_OBJECT_ID.
Так почему же удаление работает, а создание — нет?
А>Всё время получаю ошибку access denied, ничего не создаётся.
А это вот не твой случай?
Attempting to set an object identifier on an object that already has an object identifier will fail. An attempt to use an object identifier that is already in use on the volume will also fail.
И ты уверен вообще, что правильно используешь Object IDs? Чего ты хочешь добиться в итоге?
Здравствуйте, x64, Вы писали:
А>>Всё время получаю ошибку access denied, ничего не создаётся.
x64>А это вот не твой случай?
x64>x64>Attempting to set an object identifier on an object that already has an object identifier will fail. An attempt to use an object identifier that is already in use on the volume will also fail.
x64>И ты уверен вообще, что правильно используешь Object IDs? Чего ты хочешь добиться в итоге?
Первый случай — уверен, так как у файла в момент создания отсутствует object id. Проверку его наличия, чтение его данных и удаление
я уже умею. Добиться хочу создания объектного идентификатора при помощи FSCTL_SET_OBJECT_ID.
Второй случай — я брал GUID существующего файла и менял там последние 5 цифр на другие. Вроде бы этого достаточно, чтобы получить
уникальный GUID для данного конкретного файла.
Мне подсказали рабочий вариант, прислали на почту. Решение проблемы выложил здесь:
http://hex.pp.ua/set-object-id.php