c – 是什么导致WriteFile返回ERROR_ACCESS_DENIED?

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

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

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

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

>如果调用未写入的文件句柄(即打开仅供读取),则WriteFile将导致ERROR_ACCESS_DENIED.
>如果是,则不会导致ERROR_ACCESS_DENIED

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

这让我们看到了这种情况,如果文件实际上是用read标志而不是write标志打开的,那么这个调用的唯一可能性就是失败了.但是,看看我们的代码,这似乎不太可能. (由于我们的跟踪,我们可以确定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.

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...