是什么导致WriteFile返回ERROR_ACCESS_DENIED?

时间:2010-11-30 10:19:44

标签: c++ windows winapi visual-c++ file-io

我们目前面临调用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)。
  3. 这让我们了解情况,如果文件实际上是用read标志而不是write标志打开的话,那么这个调用的唯一可能性就是失败了。但是,看看我们的代码,这似乎不太可能。 (由于我们的跟踪,我们可以确保WriteFile失败并且我们可以确保错误是ERROR_ACCESS_DENIED,我们不能100.1%确定开放标志,因为这些没有被追溯。)

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

    注意:另外澄清这个问题的背景:

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

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

4 个答案:

答案 0 :(得分:4)

问题是

  

是什么导致WriteFile返回   ERROR_ACCESS_DENIED?

我在问题中说过

  
      
  1. WriteFile会导致   ERROR_ACCESS_DENIED如果被调用   对于未打开的文件句柄   写作(即开放)   只读)。
  2.   

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

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

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

答案 1 :(得分:1)

答案 2 :(得分:1)

有大约十几种不同的情况可能导致ERROR_ACCESS_DENIED。在内部,所有WriteFile都会调用NtWriteFile并将其(有些有意义的)NTSTATUS错误代码映射到一个不太有意义的HRESULT。

除其他外,ERROR_ACCESS_DENIED可能表示该文件位于网络卷上,并且写入权限出错,或者该文件实际上不是文件而是目录。

答案 3 :(得分:0)

如果你可以调试它,你应该。它可能是一百万件事:

  • msdn是错误的(它发生了很多)
  • 某个应用程序(病毒?)正在挂钩WriteFile并导致不同的行为
  • 文件系统问题?
  • 您的日志记录或观察中出现了问题