c++ - Windows 8 : CreateFile() returns INVALID_HANDLE_VALUE, 即时 GetLastError 显示 0

标签 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 输出:

Render 15:41:46.715: BufCreate: CreateFile failed (0); retrying with SharedWrite

Render 15:41:46.715: BufCreate: CreateFile failed (0)

因为这种情况相对随机发生,发送到 MS 是行不通的;他们会以“不代表”的方式将其退还给我,而我会因为 SRX 而受到指责。有人知道我将如何进行吗?

最佳答案

这很烦人。原来我没有在我认为的地方写文件,这就是它失败的原因。但它应该返回错误 5(访问被拒绝),而由于 GetLastError 中的这个该死的 0,我被搞得一头雾水。

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

更正它,以便我实际上是在我认为我已经摆脱了失败的地方写的......但我仍然不明白为什么 Windows 将错误 0 返回给我。

关于c++ - Windows 8 : CreateFile() returns INVALID_HANDLE_VALUE, 即时 GetLastError 显示 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34191919/

相关文章:

c++ - 像文件描述符(fstream)一样处理套接字描述符? C++/Linux

c++ - CoreBluetooth 与 C++

C++ 变量别名——那到底是什么,为什么关闭它会更好?

c - '->' 的基本操作数具有非指针值;但我几乎可以肯定它有指针类型?

c++ - 复制列表和关联的迭代器

c - 当服务器未启动时,无法与服务器建立重复的 SOCK_STREAM 连接?

c - C 中的可移植性问题

windows - USB 设备的 SetupComm、SetCommState、SetCommTimeouts 失败

javascript - 使用 JS 和 html5 从字符串创建文本文件

file - 我将如何在 Delphi 中创建一个文本文件