Пытаюсь создать атрибут Object Id у файла на NTFS. У этого файла в момент создания такого атрибута нет. Предварительно получаю привилегии SE_BACKUP_PRIVILEGE и SE_RESTORE_PRIVILEGE. Файл открыт так: Код (Text): hNew = CreateFile("filename", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_FLAG_BACKUP_SEMANTICS, NULL); Делаю так: Код (Text): 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. Так почему же удаление работает, а создание — нет?
Мне подсказали рабочий вариант, прислали на почту. Решение проблемы выложил здесь: http://hex.pp.ua/set-object-id.php