如何在 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' );
我使用 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
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' );