【问题标题】:Windows 8: CreateFile() returns INVALID_HANDLE_VALUE, immediate GetLastError shows 0Windows 8:CreateFile() 返回 INVALID_HANDLE_VALUE,立即 GetLastError 显示 0
【发布时间】:2015-12-10 00:56:12
【问题描述】:

我在 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 failed (0);使用 SharedWrite 重试

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

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

【问题讨论】:

  • 尝试禁用 AV,看看是否仍然发生。
  • GetLastError()() 返回一个 DWORD。不确定 '%ld' 是否是正确的说明符?
  • 不管它是什么,它似乎每 10 年发生一次 forum.sysinternals.com/… ;-) LogMsg 是一个实际的函数、宏还是其他东西?
  • dxiv 所说的。在没有看到LogMsg 是什么的情况下,我们无法判断对GetLastError 的调用是否“立即”。据我们所知,它可能是#define LogMsg(x, y) if (someFunc()) printf(x, y)
  • 抱歉回复晚了;我想当有人回答时我会立即收到邮件。 kichik:Win8上的AV是MSE,没办法关掉。 MartinJames,%ld (longint = 32 bits = DWORD) 有效,它会为 0x8nnnnnnn 给出一个负值,但 Windows Calculator 会对其进行 hexify 没问题。 dxiv、DavidSchwartz、LogMsg 是直接函数调用,GLE 的结果直接压入堆栈。 user6629249 文件名记录在别处。

标签: c++ c createfile


【解决方案1】:

这很烦人。事实证明,我没有在我认为的位置写入文件,这就是它失败的原因。但它应该返回错误 5(访问被拒绝),因为 GetLastError 中的这个该死的 0,我被引导到了一个树桩上。

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

纠正这个问题,以便我实际上在写我认为我摆脱了失败的地方......但我仍然不明白为什么 Windows 将错误 0 退回给我。

【讨论】:

    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2016-03-10
    相关资源
    最近更新 更多