Не работает FSCTL_SET_OBJECT_ID

Тема в разделе "WASM.WIN32", создана пользователем amdf, 10 май 2011.

  1. amdf

    amdf New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2011
    Сообщения:
    39
    Пытаюсь создать атрибут Object Id у файла на NTFS.
    У этого файла в момент создания такого атрибута нет.

    Предварительно получаю привилегии
    SE_BACKUP_PRIVILEGE и SE_RESTORE_PRIVILEGE.

    Файл открыт так:
    Код (Text):
    1. hNew = CreateFile("filename", GENERIC_WRITE,
    2.       FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
    3.       FILE_FLAG_BACKUP_SEMANTICS, NULL);
    Делаю так:
    Код (Text):
    1.   if (!DeviceIoControl(hNew, FSCTL_SET_OBJECT_ID,
    2.       pObj, sizeof(OBJECTID_ATTRIBUTE), NULL, 0, &dwRet, NULL))
    3.   {
    4.     PrintWin32Error();
    5.     CloseHandle(hNew);
    6.     return FALSE;
    7.   }
    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.
    Так почему же удаление работает, а создание — нет?
     
  2. amdf

    amdf New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2011
    Сообщения:
    39
    Мне подсказали рабочий вариант, прислали на почту. Решение проблемы выложил здесь: http://hex.pp.ua/set-object-id.php