是什么导致WriteFile返回ERROR_ACCESS_DENIED?

Mar*_* Ba 7 c++ windows file-io winapi visual-c++

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

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

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

现在,WriteFiles的文档并没有真正的帮助,并且尝试使用简单的测试应用程序会产生以下结果:

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

这让我们看到了这种情况,如果文件实际上是用read标志而不是write标志打开的话,那么这个调用的唯一可能性就是失败了.但是,看看我们的代码,这似乎不太可能.(由于我们的跟踪,我们可以确信的WriteFile失败,我们可以肯定的是,错误是ERROR_ACCESS_DENIED,我们不能确保开口标志的100.1%,因为这些不被描绘出.)

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

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

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

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

Mar*_* Ba 6

问题是

是什么原因导致 WriteFile 返回 ERROR_ACCESS_DENIED?

我在问题中指出

  1. 如果为未打开写入(即打开为只读)的文件句柄调用 WriteFile 将导致 ERROR_ACCESS_DENIED。

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

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

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