当我尝试打开删除挂起的文件时,为什么Windows返回ERROR_ACCESS_DENIED

Ben*_*min 3 windows filesystems file-io winapi device-driver

当我们打开一个删除挂起的文件时,即使Windows子系统具有ERROR_DELETE_PENDING状态,它们也会返回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?    
Run Code Online (Sandbox Code Playgroud)

对于最后一个CreateFile函数,文件系统驱动程序返回STATUS_DELETE_PENDING。
但是Win32子系统将其转换为ERROR_ACCESS_DENIED。为什么?

我认为应该是ERROR_DELETE_PENDING,并且很好奇他们为什么这样设计。
是否有充分的理由?

Joh*_*ohn 5

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

在Windows XP中,将ERROR_DELETE_PENDING的定义添加到winerror.h中,但是看起来映射一直都是这种方式。

我猜有人与您有相同的想法-为什么不将STATUS_DELETE_PENDING映射到ERROR_DELETE_PENDING,尝试添加此新的错误代码并发现它破坏了期望ERROR_ACCESS_DENIED的应用程序。因此他改回了映射,但忘记从winerror.h中删除定义。