【发布时间】: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