Windows 7 Windows7中的CreateFile错误

Windows 7 Windows7中的CreateFile错误,windows-7,createfile,system32,Windows 7,Createfile,System32,我注意到,如果CreateFile函数的path参数以\Windows\System32\为目标,则调用失败,出现以下错误代码error\u path\u NOT\u FOUND 文件路径正确,我是文件夹的所有者,所以问题是为什么调用失败?MS是否添加了禁止访问文件夹的特殊策略 示例代码: TCHAR szFile[MAX_PATH]; PathCombine(szFile, g_szSystemDirectory, "settings.ini"); HANDLE hFile = Create

我注意到,如果
CreateFile
函数的path参数以
\Windows\System32\
为目标,则调用失败,出现以下错误代码
error\u path\u NOT\u FOUND

文件路径正确,我是文件夹的所有者,所以问题是为什么调用失败?MS是否添加了禁止访问文件夹的特殊策略

示例代码:

TCHAR szFile[MAX_PATH];
PathCombine(szFile, g_szSystemDirectory, "settings.ini");

HANDLE hFile = CreateFile(szFile,
                          GENERIC_READ,
                          0,
                          NULL,
                          OPEN_EXISTING,
                          0,
                          NULL);

if (hFile == INVALID_HANDLE_VALUE)
{
    printf("INVALID FILE: %i", GetLastError());
    return FALSE;
}

您的程序可能需要以管理员身份运行。即使您是管理员,也必须升级您的权限。运行程序时单击鼠标右键,然后单击“以管理员身份运行”,或者编辑属性并选择“始终以管理员身份运行”。

您的程序可能需要以管理员身份运行。即使您是管理员,也必须升级您的权限。运行程序时单击鼠标右键,然后单击“以管理员身份运行”,或者编辑属性并选择“始终以管理员身份运行”

  • 我们能看一些示例代码吗
  • 您是否指定了驱动器,即“C:\Windows\System32”
  • 您正在尝试打开system32中的文件吗
  • 这是否仅在Windows 7上发生? 及
  • 为什么首先需要修改system32中的任何内容
  • 比利3

  • 我们能看一些示例代码吗
  • 您是否指定了驱动器,即“C:\Windows\System32”
  • 您正在尝试打开system32中的文件吗
  • 这是否仅在Windows 7上发生? 及
  • 为什么首先需要修改system32中的任何内容

  • Billy3

    如果它是运行在64位操作系统上的32位应用程序,那么在调用CreateFile之前调用Wow64DisableWow64FsRedirection()将从“C:\Windows\System32”读取,而不是“C:\Windows\Syswow64”,这可能是您遇到的情况。

    如果它是运行在64位操作系统上的32位应用程序,那么调用Wow64DisableWow64FsRedirection()在调用CreateFile之前,您将从“C:\Windows\System32”而不是“C:\Windows\Syswow64”读取数据,这可能是您遇到的情况。

    使用Windows XP,两个管理员/标准帐户都不需要管理权限来获取设备句柄

    这在Vista、Windows 7(UAC)上发生了变化,您必须拥有管理员权限才能获得设备句柄

    一些解决办法是:

  • 使用服务
  • 使用COM提升名字对象
  • 使用清单

  • 注意:如果您只需要从设备查询统计信息,则不需要管理权限。使用
    CreateFile()
    时,请为dwDesiredAccess参数指定零(0)。

    使用Windows XP,两个管理员/标准帐户都不需要管理权限来获取设备句柄

    这在Vista、Windows 7(UAC)上发生了变化,您必须拥有管理员权限才能获得设备句柄

    一些解决办法是:

  • 使用服务
  • 使用COM提升名字对象
  • 使用清单

  • 注意:如果您只需要从设备查询统计信息,则不需要管理权限。使用
    CreateFile()
    时,为dwDesiredAccess参数指定零(0)。

    1)我将在稍后添加。2) 对。3) 对。4) 是的,在XP下工作正常。5) 需要加载配置文件。为什么配置文件在system32中?你不应该把它放在%appdata%中吗?是的,它是64位。这是一个遗留应用程序,所以我不知道:)WOW不是将呼叫重定向到system32,而是重定向到syswow64。看到了吗?你对那个文件夹有权限吗?您要查找的文件是否在该文件夹中?因为x64上的呼叫实际上就是在这里进行的。问题是您的32位应用程序无法看到C:\Windows\System32文件夹。为了兼容性,64位windows上的所有32位应用在请求system32中的文件时,会自动重定向到C:\windows\Syswow64。如果您将配置文件放在syswow64中,但在system32中请求它,它将正确打开。1)我稍后添加。2) 对。3) 对。4) 是的,在XP下工作正常。5) 需要加载配置文件。为什么配置文件在system32中?你不应该把它放在%appdata%中吗?是的,它是64位。这是一个遗留应用程序,所以我不知道:)WOW不是将呼叫重定向到system32,而是重定向到syswow64。看到了吗?你对那个文件夹有权限吗?您要查找的文件是否在该文件夹中?因为x64上的呼叫实际上就是在这里进行的。问题是您的32位应用程序无法看到C:\Windows\System32文件夹。为了兼容性,64位windows上的所有32位应用在请求system32中的文件时,会自动重定向到C:\windows\Syswow64。如果您将配置文件放在syswow64中,但在system32中请求它,它将正确打开。