当我尝试打开删除暂停文件时,为什么Windows返回ERROR_ACCESS_DENIED

时间:2011-07-13 14:26:32

标签: windows winapi file-io filesystems device-driver

当我们打开删除挂起的文件时,即使它们具有ERROR_DELETE_PENDING状态,Windows子系统也会返回ERROR_ACCESS_DENIED。

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 个答案:

答案 0 :(得分:3)

不得不研究这个琐事,就像往常一样,当winapi中的某些东西只能通过历史原因来解释时,Raymond Chen会在那里告诉我们:

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

所以STATUS_DELETE_PENDING实际上意味着与你期望它的意思不同的东西!

答案 1 :(得分:3)

Windows内核和“本机”api使用NTSTATUS代码。 Win32使用Win32错误代码,可以追溯到DOS错误代码。 Windows始终将STATUS_DELETE_PENDING映射到ERROR_ACCESS_DENIED。我能够在NT4上验证这一点,它没有在winerror.h中定义ERROR_DELETE_PENDING。

在Windows XP中,ERROR_DELETE_PENDING的定义已添加到winerror.h中,但看起来映射一直是这样的。

我猜有人和你有同样的想法 - 为什么不将STATUS_DELETE_PENDING映射到ERROR_DELETE_PENDING,试图添加这个新的错误代码,发现它破坏了期望ERROR_ACCESS_DENIED的应用程序。所以他改回了映射但忘了从winerror.h中删除定义