【问题标题】:Createprocess() of "C:\\Windows\\System32\\OpenSSH\\ssh.exe" fails with error=2 [duplicate]“C:\\Windows\\System32\\OpenSSH\\ssh.exe”的 Createprocess() 失败,错误=2 [重复]
【发布时间】:2020-04-22 07:09:10
【问题描述】:

在 Windows-10 机器上,我尝试使用 createprocess 将 ssh.exe 作为子进程运行,类似于下面的 sn-p:

// 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\\ssh.exe”时,CreateProcess API 失败并出现错误 2(找不到文件)。令人费解的是,这个文件 - ‘C:\Windows\System32\OpenSSH\ssh.exe’ - 存在于机器上;然而,CreateProcess() 报告错误 2。如果我将 'C:\Windows\System32\OpenSSH\ssh.exe' [从命令提示符] 复制到其他位置,请说 'C:\tmp\System32_OpenSSH\ssh.exe' 和然后使用包含“C:\\tmp\\System32_OpenSSH\\ssh.exe”的 child_cmd 参数调用 CreateProcess(),完全相同的程序就像一个魅力。任何线索这里发生了什么?操作系统对 C:\Windows\system32 文件夹是否有任何限制?

我在文件复制方面也遇到了类似的问题 - system("copy C:\\Windows\\system32\\OpenSSH\\ssh.exe OpenSSH_ssh.exe")。

【问题讨论】:

  • Win32上的错误代码2是"The system cannot find the file specified. "

标签: c windows createprocess system32


【解决方案1】:

你必须用双斜线转义路径中的斜线。

【讨论】:

  • 好的,谢谢。斜线在程序中用双斜线转义。这里的文本编辑器把它们弄乱了。我编辑了问题以将它们添加回问题中。
  • 我应该删除我的答案吗?
  • 否;你的回答帮助我注意到问题中缺少双斜线,并更正它。
【解决方案2】:

我的超能力表明,虽然您的 C:\Windows\System32\OpenSSH 文件夹中确实有一个名为 ssh.exe 的二进制文件,但您的编译代码运行为 32 位,但您的操作系统是 64 位。

在 64 位操作系统上运行的 32 位代码会为某些文件夹获取文件系统的重定向。这样任何访问C:\Windows\System32 的尝试都会映射到C:\Windows\SysWOW64。我猜您的C:\Windows\SysWOW64\OpenSSH 文件夹中没有ssh.exe 的副本。 (看来我也是。)

如果您将代码编译为 64 位,它可能会起作用。在我的脑海中,如果允许 32 位进程“创建”64 位进程,我不记得规则。 (我会这么认为 - 对吧?)但是快速的谷歌参考 this post on StackOverflow。看起来有 some APIs 可以被调用来禁用文件系统重定向。

【讨论】:

  • WOW64 进程还具有用于访问本机“%SystemRoot%\System32”目录的“%SystemRoot%\SysNative”虚拟路径。不幸的是,本机进程没有“SysNative”。
  • 非常感谢!所以,这确实是操作系统的魔法/限制。不幸的是,由于其他依赖关系,我没有将代码更改为 64 位的灵活性。因此,我将实现禁用文件系统重定向的方法。感谢您的帮助和宝贵的指点!
  • 酷。如果您发现它可以解决您的问题,请不要忘记接受答案。
猜你喜欢
  • 1970-01-01
  • 2012-01-21
  • 2021-03-12
  • 2014-02-26
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多