#c #winapi #filesystems #ntfs
#c #winapi #файловые системы #ntfs
Вопрос:
Сталкиваюсь с новым кодом ошибки Windows 10, открывающим файл для чтения с помощью CreateFile()
. Мы получаем ошибку 395, но имеется скудная информация о том, что это значит или как устранить. Сведения об ошибке из Windows 10 SDK следующие
- Номер ошибки 395
- Постоянная ошибка
ERROR_CLOUD_FILE_ACCESS_DENIED
- Сообщение об ошибке операционной системы «Доступ к облачному файлу запрещен».
Рассматриваемый компьютер — Windows 10 Professional. Запущен OneDrive, но файл не находится в папке OneDrive. Мы подозреваем, что OneDrive может использовать свою известную функцию перемещения папки
Код, используемый для открытия файла, является:
HANDLE hnd = ::CreateFile(fname,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if (hnd == INVALID_HANDLE_VALUE) {
DWORD exitcode = ::GetLastError();
printf("%dn", exitcode);
}
Если кто-нибудь сталкивался с этой проблемой, мы были бы признательны за любую информацию, которой вы можете поделиться.
Комментарии:
1. просто ошибка, возвращаемая драйвером фильтра cldflt.sys (c000cf18). вы пытаетесь открыть файл, система возвращает вам ошибку и отказывает в доступе к нему. как есть
2. Вы имеете в виду, что использование
Createfile
для доступа к существующим файлам на OneDrive запрещено и сообщается об ошибке 395, верно?3. Если возможно, ссылка, на которую вы можете сослаться: windowsreport.com/onedrive-access-denied-error
Ответ №1:
После тщательного исследования мы обнаружили, что это было вызвано простой проблемой с разрешениями. Пользовательский процесс, выполняющий CreateFile()
вызов, не имел разрешений на доступ к файлу, который хранился в облаке. В OneDrive Known File Move
, без нашего ведома, папка была сохранена в облаке.
Как только мы поняли, что это проблема с облачными разрешениями, было просто исправить облачное разрешение, чтобы позволить пользовательскому процессу открывать файл.
В нашем конкретном случае мы договорились запустить наш процесс от имени администратора, что позволило нашему вызову CreateFile()
завершиться успешно. Если вы пытаетесь получить доступ к файлу, хранящемуся в общей папке OneDrive, принадлежащей другому пользователю, вы не сможете использовать это решение. Вам нужно будет попросить владельца файла предоставить вам запрашиваемый доступ.