CreateFileA завершается с ошибкой ERROR_ACCESS_DENIED - PullRequest
1 голос
/ 05 марта 2012

Мне нужно получить дескриптор каталога, чтобы можно было вызвать ReadDirectoryChangesW .На самом деле, мне нужно немного больше, но сначала пойдем проще.Я сузил проблему до этого:

m_directoryHandle = CreateFileA(
    "C:\\Users\\victor\\Documents\\Projets\\libxnotify\\unittests", // __in      LPCTSTR lpFileName,
    FILE_LIST_DIRECTORY,    // __in      DWORD dwDesiredAccess,
    0,                      // __in      DWORD dwShareMode,
    0,                      // __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    OPEN_EXISTING,          // __in      DWORD dwCreationDisposition,
    0,                      // __in      DWORD dwFlagsAndAttributes,
    0                       // __in_opt  HANDLE hTemplateFile
);

Это возвращает INVALID_HANDLE_VALUE с последним кодом ошибки ERROR_ACCESS_DENIED.Излишне говорить, что я пробовал кучу разных параметров, ни один из них не работал.Я запускаю свою программу как victor, и чтобы убедиться, что у меня действительно есть права в этом каталоге unittests, я открыл командную оболочку и набрал:

C:\Users\victor>echo bla >> "C:\Users\victor\Documents\Projets\libxnotify\unittests\test"

, и это сработало.

1 Ответ

3 голосов
/ 05 марта 2012

Документация для ReadDirectoryChangesW содержит замечание, в котором говорится:

Чтобы получить указатель на каталог, используйте функцию CreateFile с флагом FILE_FLAG_BACKUP_SEMANTICS .

В документации для CreateFile имеется также более подробное замечание по этому поводу:

Директории

Приложение не может создать каталог с помощью CreateFile, поэтому только значение OPEN_EXISTING допустимо для dwCreationDisposition для этого варианта использования. Чтобы создать каталог, приложение должно вызвать CreateDirectory или CreateDirectoryEx.

Чтобы открыть каталог с помощью CreateFile, укажите флаг FILE_FLAG_BACKUP_SEMANTICS как часть dwFlagsAndAttributes. Соответствующие проверки безопасности все еще применяются, когда этот флаг используется без привилегий SE_BACKUP_NAME и SE_RESTORE_NAME .

Вам не хватает этого важного FILE_FLAG_BACKUP_SEMANTICS флага для dwFlagsAndAttributes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...