gpt4 book ai didi

c++ - 是什么导致 WriteFile 返回 ERROR_ACCESS_DENIED?

转载 作者:可可西里 更新时间:2023-11-01 13:11:19 25 4
gpt4 key购买 nike

我们目前面临调用 WriteFile(或者更确切地说是 CFile::Write - 但只是在内部调用 WriteFile)导致 Win32 错误 5 ERROR_ACCESS_DENIED

(编辑:请注意,我们无法重现该行为。目前我们所拥有的只是一个日志文件,指示 CFile::Write 所在的源代码行并包含错误 ERROR_ACCESS_DENIED!)

(编辑:该文件位于本地 驱动器上,它实际上是一个文件而不是一个目录。)

现在,WriteFiles's documentation并没有真正帮助,并且使用简单的测试应用程序进行试验会产生以下结果:

  1. WriteFile 如果为未以写入方式打开(即以只读方式打开)的文件句柄调用它时会导致 ERROR_ACCESS_DENIED。
  2. 不会在以下情况下导致 ERROR_ACCESS_DENIED
    • 句柄无效或文件根本没有打开
    • 文件的访问权限或文件的写保护标志在进程打开文件之后被修改。 (如果在打开文件之前修改了这些,那么我们将永远无法访问 WriteFile,因为打开文件将失败。)
    • 文件以某种方式被另一个进程/句柄锁定(这最多会导致错误 32 ERROR_SHARING_VIOLATION)。

这给我们留下了这样的情况,如果文件实际上是用读标志而不是写标志打开的,显然这个调用失败的唯一可能性。然而,看看我们的代码,这似乎极不可能。 (由于我们的跟踪, 我们 可以确定 WriteFile 失败并且 我们可以确定错误是ERROR_ACCESS_DENIED,我们不能100.1%确定打开标志,因为这些没有被追踪出来。)

是否存在 WriteFile (CFile::Write) 会导致 ERROR_ACCESS_DENIED 的任何其他已知情况?

注意:为了进一步澄清这个问题的背景:

  • 文件打开,因此它不能是目录或类似的
  • 我执行的所有测试表明,当文件打开时无法删除,因此在调用 WriteFile 时文件应该仍然存在
  • 文件位于本地驱动器上,而不是网络驱动器上。

我应该补充一点,我们在 WIndows XP sp3 上运行,应用程序是用 Visual Studio 2005 编译的。

最佳答案

问题是

What causes WriteFile to return ERROR_ACCESS_DENIED?

我在问题中说

  1. WriteFile will cause ERROR_ACCESS_DENIED if it is called for a file handle that is not opened for writing (i.e. is opened for reading only).

在为打开标志和另一个事件添加更多日志记录后,事实证明这是正确的。打开标志的日志记录显示,在错误点,文件对象是使用 CFile::modeRead 打开的,因此我们得到 ERROR_ACCESS_DENIED。

还没有发现是哪个奇怪的代码路径导致了这个,但这只是表明:永远不要相信你自己的代码。 :-)

(哦,顺便说一句。失败的不是 ::WriteFile,而是 ::FlushFileBuffers API,但显然会返回相同的错误。)

关于c++ - 是什么导致 WriteFile 返回 ERROR_ACCESS_DENIED?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4312568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com