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,并且很好奇他们为什么这样设计。
是否有充分的理由?
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中删除定义。
| 归档时间: |
|
| 查看次数: |
3413 次 |
| 最近记录: |