Как запустить 64-битный процесс из 32-битного процесса

Я пытаюсь запустить 64-битный исполняемый файл (java.exe) из нашего 32-битного приложения .NET. Я использую класс Process и вызываю cmd /c <command name> для поддержки всех возможных команд (таких как dir, cd и т. д.).

Проблема в том, что на моей машине я установил 64-битную версию JRE, а java.exe доступен только из папки C:\Windows\System32 (x64). Я попытался явно запустить 64-битную версию cmd.exe, вызвав C:\Windows\System32\cmd.exe, но она перенаправляется на SysWOW64 из-за того, что процесс вызова является 32-битным.

Есть ли что-нибудь еще, что я могу сделать, чтобы заставить это работать?

РЕДАКТИРОВАТЬ Все это cmd /c немного отвлекающий маневр. Это не часть проблемы, а возможность запускать 64-битные исполняемые файлы.


person Igor Zevaka    schedule 05.01.2010    source источник
comment
Этот ответ может пролить свет на этот вопрос: заголовок stackoverflow.com/questions/9466850/   -  person Dan Ochiana    schedule 23.10.2014
comment
Этот ответ может помочь: stackoverflow.com/questions/9466850/   -  person Dan Ochiana    schedule 23.10.2014


Ответы (6)


Вы можете временно отключить перенаправление файловой системы вокруг вызова Process.Start, соответствующие API для P/Invoke: Wow64DisableWow64FsRedirection и Wow64RevertWow64FsRedirection.

Другой вариант — использовать %windir%\sysnative, который доступен в Windows Vista и более поздних версиях.

person Michael    schedule 05.01.2010
comment
Звучит страшно, попробую :) - person Igor Zevaka; 05.01.2010
comment
Действительно это работает. Я не могу поверить, что это официальный способ сделать это - msdn.microsoft.com/en-us/library/aa365743%28VS.85%29.aspx — MSDN демонстрирует использование этой функции именно для этой цели. - person Igor Zevaka; 05.01.2010
comment
Круто, sysnative тоже работал, возможно, я его использую в финальной версии. - person Igor Zevaka; 05.01.2010
comment
Обязательно используйте sysnative. Несмотря на то, что Wow64DisableWow64FsRedirection влияет только на текущий поток, это более сложный способ и требует от вас использования P/Invoke (что также означает, что вам нужно полное доверие). Как Java вообще оказалась в системном каталоге? Разве это не должно быть в программных файлах, как и все хорошо работающие приложения? - person Luaan; 16.07.2014
comment
Вероятно, стоит отметить, что sysnative существует только для 32-битных процессов. Если ваш процесс 64-битный, вы получите исключение File not found. Таким образом, вы все равно должны проверить свою разрядность перед доступом к sysnative, что является позором, потому что было бы намного лучше, если бы он разрешался в одну и ту же папку независимо от вашей собственной разрядности. - person GSerg; 26.02.2019
comment
универсальный доступ к sysnative из 32-разрядных и 64-разрядных процессов здесь: stackoverflow.com/a/67942292/1351740 - person DrakonHaSh; 11.06.2021

Что вы делаете, так это используете %windir%\sysnative для разрешения 64-битного CMD.EXE, а затем запускаете другую 64-битную программу с помощью параметра командной строки «/c».

person Nikolai    schedule 17.02.2014
comment
Большое спасибо! Чтобы уточнить использование: C:\Windows\Sysnative\cmd.exe будет запускать то, что эффективно находится в C:\Windows\System32 без перенаправления. Дополнительная информация: samlogic.net/articles/sysnative-folder-64 -bit-windows.htm - person Diego Frehner; 28.07.2014
comment
sysnative-Folder отсутствует в Windows10 - person MHolzmayr; 07.10.2016
comment
Ни Windows 7, ни 8.1 - person Brian THOMAS; 16.11.2016
comment
Вы не можете его увидеть, но вы можете перейти к c:\windows\sysnative в wnidows 10 или запустить, например, c:\windows\sysnative\notepad.exe и получить 64-битную, если вы в 32 например, бит cmd (или 32-битный клиент kace). Хороший совет. - person js2010; 11.04.2017

На всякий случай это может помочь. .microsoft.com/en-us/library/aa384187(VS.85).aspx

Обратите внимание, что если приложение отображается для отображения подсказки UAC, перенаправление не произойдет. А также некоторые папки освобождены от перенаправления.

person Santhosh    schedule 13.01.2010

Вот способ внутри окна cmd переключиться на 64-битную cmd, если вы окажетесь в 32-битной версии:

if %PROCESSOR_ARCHITECTURE%==x86 %windir%\sysnative\cmd

Или для условного выполнения в 64-битном режиме внутри 32-битного пакетного процесса:

if %PROCESSOR_ARCHITECTURE%==x86 "%windir%\sysnative\cmd" /c "someProgram"

Или еще лучше:

set "commands=multiple commands & to execute"
if %PROCESSOR_ARCHITECTURE%==x86 ( "%windir%\sysnative\cmd" /c "%commands%" ) else ( %commands% )
person BuvinJ    schedule 20.10.2020

Чтобы запустить процесс/скрипт через 64-битный cmd.exe, вы можете использовать это:

%windir%\SysWOW64\cmd.exe /c %windir%\sysnative\cmd.exe /c ProgramToRun parameters

Это решение универсально работает как с 32-разрядными, так и с 64-разрядными процессами.


p.s.
%windir%\sysnative существует только в 32-битных процессах.
%windir%\SysWOW64 существует как в 32-битных, так и в 64-битных процессах.

person DrakonHaSh    schedule 11.06.2021

«sysnative», кажется, имеет некоторые недостатки.

Пример: когда вы запускаете powershell.exe через C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe, некоторые CmdLet, такие как Get-AppxProvisionedPackage" and "Get-WindowsCapability, не работают/генерируют исключения:

Get-AppxProvisionedPackage: "Ошибка установки текущего каталога в "C:\Windows\SysNative\WindowsPowerShell\v1.0": часть пути "C:\Windows\SysNative\WindowsPowerShell\v1.0" не найдена"

(в переводе с немецкого "Fehler beim Festlegen des aktuellen Verzeichnisses auf"C:\Windows\SysNative\WindowsPowerShell\v1.0": Ein Teil des Pfades "C:\Windows\SysNative\WindowsPowerShell\v1.0" konnte nicht gefunden werden. ")

Могут быть аналогичные проблемы с запуском других процессов, кроме powershell (всякий раз, когда исходный каталог процесса важен?) ...

person Markus    schedule 08.07.2019