"C:\Windows\System32\OpenSSH\ssh.exe" 的 Createprocess() 失败,错误为 2
Createprocess() of "C:\\Windows\\System32\\OpenSSH\\ssh.exe" fails with error=2
在 Windows-10 机器上,我正在尝试 运行 ssh.exe 作为使用 createprocess 的子进程,类似于下面的代码片段:
// Create the child process.
bSuccess = CreateProcess(NULL,
child_cmd, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
// If an error occurs, exit the application.
if (!bSuccess)
{
ErrorExit(TEXT("CreateProcess"));
return NULL;
}
当 child_cmd 参数包含“C:\\Windows\\System32\\OpenSSH\\[=23 时,CreateProcess API 失败并出现错误 2(未找到文件) =]”。令人费解的是,这个文件——‘C:\Windows\System32\OpenSSH\ssh.exe’——存在于机器上;然而,CreateProcess() 报告错误 2。如果我将 'C:\Windows\System32\OpenSSH\ssh.exe' [从命令提示符] 复制到其他位置,请说 'C:\tmp\System32_OpenSSH\ssh.exe' 然后调用 CreateProcess( ) child_cmd 参数包含“C:\\tmp\\System32_OpenSSH\\ssh.exe”,完全相同的程序就像一个魅力。知道这里发生了什么吗?是否对 C:\Windows\system32 文件夹施加了任何 OS 限制?
我在文件复制方面也遇到了类似的问题 - system("copy C:\Windows\system32\OpenSSH\ssh.exe OpenSSH_ssh.exe").
你必须用双斜杠转义路径中的斜杠。
我的通灵能力表明,虽然你的 C:\Windows\System32\OpenSSH
文件夹中确实有一个名为 ssh.exe
的二进制文件,但你的编译代码是 运行 作为 32 位,但是你的 OS 是 64 位。
32 位代码 运行 在 64 位 OS 上获取特定文件夹的文件系统重定向。这样任何访问 C:\Windows\System32
的尝试都会映射到 C:\Windows\SysWOW64
。我猜您的 C:\Windows\SysWOW64\OpenSSH
文件夹中没有 ssh.exe
的副本。 (看来我也是这样。)
如果您将代码编译为 64 位,它可能会工作。如果允许 32 位进程 "create" 64 位进程,我不记得规则了。 (我会这么认为 - 对吗?)但是快速 Google 引用 this post on Whosebug. Looks like there are some APIs 可以调用它来禁用文件系统重定向。
在 Windows-10 机器上,我正在尝试 运行 ssh.exe 作为使用 createprocess 的子进程,类似于下面的代码片段:
// Create the child process.
bSuccess = CreateProcess(NULL,
child_cmd, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
// If an error occurs, exit the application.
if (!bSuccess)
{
ErrorExit(TEXT("CreateProcess"));
return NULL;
}
当 child_cmd 参数包含“C:\\Windows\\System32\\OpenSSH\\[=23 时,CreateProcess API 失败并出现错误 2(未找到文件) =]”。令人费解的是,这个文件——‘C:\Windows\System32\OpenSSH\ssh.exe’——存在于机器上;然而,CreateProcess() 报告错误 2。如果我将 'C:\Windows\System32\OpenSSH\ssh.exe' [从命令提示符] 复制到其他位置,请说 'C:\tmp\System32_OpenSSH\ssh.exe' 然后调用 CreateProcess( ) child_cmd 参数包含“C:\\tmp\\System32_OpenSSH\\ssh.exe”,完全相同的程序就像一个魅力。知道这里发生了什么吗?是否对 C:\Windows\system32 文件夹施加了任何 OS 限制?
我在文件复制方面也遇到了类似的问题 - system("copy C:\Windows\system32\OpenSSH\ssh.exe OpenSSH_ssh.exe").
你必须用双斜杠转义路径中的斜杠。
我的通灵能力表明,虽然你的 C:\Windows\System32\OpenSSH
文件夹中确实有一个名为 ssh.exe
的二进制文件,但你的编译代码是 运行 作为 32 位,但是你的 OS 是 64 位。
32 位代码 运行 在 64 位 OS 上获取特定文件夹的文件系统重定向。这样任何访问 C:\Windows\System32
的尝试都会映射到 C:\Windows\SysWOW64
。我猜您的 C:\Windows\SysWOW64\OpenSSH
文件夹中没有 ssh.exe
的副本。 (看来我也是这样。)
如果您将代码编译为 64 位,它可能会工作。如果允许 32 位进程 "create" 64 位进程,我不记得规则了。 (我会这么认为 - 对吗?)但是快速 Google 引用 this post on Whosebug. Looks like there are some APIs 可以调用它来禁用文件系统重定向。