Windows 8:CreateFile() 返回 INVALID_HANDLE_VALUE,立即 GetLastErr

Windows 8: CreateFile() returns INVALID_HANDLE_VALUE, immediate GetLastError shows 0

本文关键字:HANDLE VALUE GetLastErr 立即 INVALID 返回 CreateFile Windows      更新时间:2023-10-16

我正在打印机过滤器环境中打开一个带有 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 SharedWritern", 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)rn", GetLastError());
    return (Vers_FAILURE);
}

日志消息输出:

渲染 15:41:46.715:BufCreate:创建文件失败 (0(;使用 SharedWrite 重试

渲染 15:41:46.715:BufCreate:创建文件失败 (0(

因为这是相对随机发生的,所以将其发送到 MS 是行不通的;他们会用"no rep"将其发回给我,我会因为 SRX 而受到批评。有没有人知道我将如何进行?

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

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

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

相关文章: