Пытаюсь создать атрибут 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.
Так почему же удаление работает, а создание — нет?