如何在 windows 上使用 x86 perl 系统启动 x64 shell

How to launch a x64 shell using x86 perl system on windows

我使用 perl 调用 system start,我需要指定我希望我的程序绑定到的 cpu 号码。

当我使用 x86 perl 时,它会启动 x86 cmd 到 运行 的启动命令。此 x86 start 不接受参数 0x100000000,因为它超过 32 位长度。如果我使用 x64 perl,整个事情都很好,因为 x64 perl 启动接受 0x100000000 的 x64 cmd

那么在使用 32 位 perl 时如何启动 x64 cmd 到 运行 start 命令?

详情:

首先,我验证了 32 位 cmd shell 不接受 start /affinity 100000000 而 64 位 cmd shell 接受。在 32 位 cmd shell 中,它抛出错误 The system cannot accept the START command parameter 100000000.

然后我分别尝试了x64 perl和x86 perl,发现x86 perl也会报同样的错误。请参阅下面的命令。

path/to/x64/perl.exe -e "system qq{start /b /wait /affinity 100000000 my.exe}"
path/to/x86/perl.exe -e "system qq{start /b /wait /affinity 100000000 my.exe}"

有没有什么方法可以启动 x64 shell 使用 x86 perl 来执行启动?

下面简单演示问题:

>sp5300-x64\perl\bin\perl -e"system 'set'" | perl -ne"print if /^ProgramFiles=/i"
ProgramFiles=C:\Program Files

>sp5300-x86\perl\bin\perl -e"system 'set'" | perl -ne"print if /^ProgramFiles=/i"
ProgramFiles=C:\Program Files (x86)

差异是由于 Windows 运行 C:\Windows\SysWOW64\cmd.exe 而不是 C:\Windows\System32\cmd.exe。这是透明内部翻译的结果,而不是 PATH 中的差异,因此更明确地说明路径无济于事。

>sp5300-x86\perl\bin\perl -e"system 'C:\Windows\System32\cmd /x /d /c set'" | perl -ne"print if /^ProgramFiles=/i"
ProgramFiles=C:\Program Files (x86)

solution 是创建一个 link 到 cmd.exe,并使用它来代替。这绕过了 Windows 的恶作剧。

>mklink cmd64.exe "C:\Windows\System32\cmd.exe"
symbolic link created for cmd64.exe <<===>> C:\Windows\System32\cmd.exe

>sp5300-x86\perl\bin\perl -e"system 'cmd64 /x /d /c set'" | perl -ne"print if /^ProgramFiles=/i"
ProgramFiles=C:\Program Files

File System Redirector WOW64 模拟器将 %SystemRoot%\system32 的文件系统路径重定向到 %SystemRoot%\SysWOW64,其中 %SystemRoot% 是系统环境变量,它指的是 Windows 目录,例如C:\Windows.

所以通常情况下,WOW64进程(32位进程运行在64位windows上)不能访问system32目录。

但是,从 windows Vista 开始,32 位进程可以通过将 system32 替换为特殊别名 system32 来引用和访问 sysetm32 目录中的文件和文件夹=19=] 在文件路径中。

要从 x86 perl 实例启动 x64 cmd shell,您需要通过 %SystemRoot%\SysNative\cmd.exe

显式指定 64 位 cmd.exe 的路径
Path_to_x86_perl\perl -e "system $ENV{SystemRoot}.'\sysnative\cmd.exe /x /d /c start /b /wait /affinity 100000000 my.exe'"

但是请注意,这仅适用于 WOW64 进程,因此它不能用作 Windows 下 x86 和 x64 版本的 perl 的单个单行解决方案。但是,您可以在程序中使用以下内容:

use Config qw( %Config );
my $system = $ENV{SystemRoot} . '\' . ( $Config{ptrsize} == 4 ? 'SysNative' : 'System32' );