Почему Windows возвращает ERROR_ACCESS_DENIED, когда я пытаюсь открыть удаленный файл - PullRequest
3 голосов
/ 13 июля 2011

Когда мы открываем удаление отложенного файла, подсистема Windows возвращает ERROR_ACCESS_DENIED, даже если они имеют статус ERROR_DELETE_PENDING.

HANDLE h = CreateFile(L"C:\\test.txt",
    GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, 0, CREATE_ALWAYS, 0, 0);
// Succeed

BOOL fOk = DeleteFile(L"C:\\test.txt");
// Succeed. The file has been delete pended now, 
// because the file is still opening.

HANDLE h2 = CreateFile(L"C:\\test.txt",
    GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0);
// Failed with ERROR_ACCESS_DENIED. But why not ERROR_DELETE_PENDING?    

Для последней функции CreateFile драйвер файловой системы возвратил STATUS_DELETE_PENDING.
Но подсистема Win32 преобразовала его в ERROR_ACCESS_DENIED. Почему?

Я думаю, что это должно быть ERROR_DELETE_PENDING, и мне очень любопытно, почему они так устроены.
Есть ли веская причина?

Ответы [ 2 ]

3 голосов
/ 03 августа 2011

Ядро Windows и "нативный" API используют коды NTSTATUS.Win32 использует коды ошибок Win32, которые относятся к кодам ошибок DOS.Windows всегда отображала STATUS_DELETE_PENDING в ERROR_ACCESS_DENIED.Я смог проверить это на NT4, который не определил ERROR_DELETE_PENDING в winerror.h.

Определение ERROR_DELETE_PENDING было добавлено в winerror.h в Windows XP, но похоже, что отображение всегда было таким.

Полагаю, у кого-то была та же идея, что и у вас - почему бы не сопоставить STATUS_DELETE_PENDING с ERROR_DELETE_PENDING, попытаться добавить этот новый код ошибки и выяснить, что это нарушает работу приложений, ожидающих ERROR_ACCESS_DENIED.Поэтому он изменил отображение обратно, но забыл удалить определение из winerror.h

3 голосов
/ 13 июля 2011

Пришлось исследовать и эту мелочь, как всегда, когда что-то в винапи можно объяснить только историческими причинами, и Раймонд Чен говорит нам об этом:

http://blogs.msdn.com/b/oldnewthing/archive/2007/11/09/6001644.aspx

Таким образом, STATUS_DELETE_PENDING на самом деле означает нечто иное, чем вы ожидаете!

...