【问题标题】:Why does Windows return ERROR_ACCESS_DENIED when I try to open a delete pended file为什么当我尝试打开删除挂起的文件时 Windows 返回 ERROR_ACCESS_DENIED
【发布时间】:2011-07-13 14:26:32
【问题描述】:

当我们打开一个删除挂起的文件时,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,我很好奇他们为什么要这样设计。
有充分的理由吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      也必须研究这个琐事,就像往常一样,winapi 中的某些东西只能用历史原因来解释,Raymond Chen 在那里告诉我们:

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

      所以 STATUS_DELETE_PENDING 实际上的含义与您预期的不同!

      【讨论】:

      • CreateFile 不会返回 ERROR_DELETE_PENDING 它会返回 ERROR_ACCESS_DENIED。这一事实对于 Raymond 正在撰写该博客条目而言并不重要。
      • 我只指出 STATUS_DELETE_PENDING 与您预期的不同。这个问题在我回答之后改变了,那是几周前的事了。
      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      相关资源
      最近更新 更多