Windows 8:CreateFile()返回INVALID_HANDLE_VALUE,立即GetLastError显示0

时间:2015-12-10 00:56:13

标签: c++ c createfile

我在打印机过滤器环境中在Windows 8上打开CreateFile的文件。代码实际上是直接C,即使过滤器是用C ++构建的。 CreateFile返回INVALID_HANDLE_VALUE但是立即调用GetLastError会返回0.我之前已经看到过这种情况,如果有一个同名目录,我会在旧的NT4天(以及到Windows 7)中看到如文件存在,文件打开尝试将失败,错误为0;但我已经检查过,文件名与目标目录中的任何子目录都不同。

代码:

io_buf[fh].fh = CreateFile(name, GENERIC_READ|GENERIC_WRITE, 0, p_sa,
                           CREATE_ALWAYS, 0, (HANDLE)0);
io_buf[fh].read_mode = FALSE;
io_buf[fh].file_start = 0L;
io_buf[fh].folder = 0;

if (io_buf[fh].fh == INVALID_HANDLE_VALUE)
{
    LogMsg("BufCreate: CreateFile failed (%ld); retrying with SharedWrite\r\n", GetLastError());
    io_buf[fh].fh = CreateFile(name, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, p_sa,
                               CREATE_ALWAYS, 0, (HANDLE) 0);
}
if (io_buf[fh].fh == INVALID_HANDLE_VALUE)
{
    LogMsg("BufCreate: CreateFile failed (%ld)\r\n", GetLastError());
    return (Vers_FAILURE);
}

LogMsg输出:

  

渲染15:41:46.715:BufCreate:CreateFile失败(0);使用SharedWrite重试

     

渲染15:41:46.715:BufCreate:CreateFile失败(0)

因为这是相对随机发生的,所以将它发送给MS是行不通的;他们用“没有代表”的方式将它发回给我,我会为SRX而战。有没有人知道我将如何进行?

1 个答案:

答案 0 :(得分:1)

这很令人烦恼。事实证明我并没有把文件写在我认为的位置,这就是它失败的原因。但它本应该返回错误5(访问被拒绝),并且由于GetLastError中的这个bedamned 0,我被引导了。

为了它的价值:我创建了一个临时目录的路径。因为我当时的安全上下文是LocalSystem(我在PrinterPipeline服务中),所以该文件位于c:\ Windows \ System32 \ Services \ LocalService \ AppData \ Local \ Temp中。没有普通用户可以到达那个空间,这种尝试很可能会让你的操作系统瘫痪。我已经更改为用户安全上下文以写入C:\ Temp,并且因为忘记将我的文件名更改为C:\ Temp而失败。错误0使我看起来可能面对文件系统重定向映射c:\ temp到LocalService空间。

纠正这一点,以便我实际上写的是我认为我摆脱了失败的地方......但我仍然不明白为什么Windows正在向我发回错误0。