Как перезапустить x32 битный процесс в 64-разрядном режиме?

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,053
Решения
2
Реакции
5,746
Делал такой перезапуск процесса в проекте Virulogs.
Вот набросал пример.
Смотри как это работает:
(батник запускать из-под c:\windows\syswow64\cmd.exe)
CMD/BATCH:
@echo off
SetLocal EnableExtensions

:: Получаю необходимые переменные
call :GetOSBitness bitOS
call :GetProcessBitness "%bitOS%" bitProc

echo.
echo Битность ОС: %bitOS%
echo Битность процесса: %bitProc%
echo.

:: Сравниванию битности и перезапускаю процесс под x64 при необходимости
call :DoEnvironRelaunch "%bitOS%" "%bitProc%"
pause

goto :eof


:DoEnvironRelaunch [in.OS.Bitness] [in.Process.Bitness]
  :: Контроль запуска скрипта в среде, соответствующей разрядности ОС
  :: Попытка перезапустить процесс в режиме x64

  if /i "%~1"=="x64" if /i "%~2" NEQ "x64" (
    rem Если ОС >= Vista или XP с hotfix-ом http://support.microsoft.com/kb/942589
    rem попытаюсь перезапустить процесс через алиас Sysnative
    if exist "%windir%\Sysnative\*" (
      ;;; echo. Скрипт запущен из 32-битной среды. Пытаюсь перезапустить из x64.
      ;;; echo. Нажмите ENTER.
      pause >NUL
      cls
      "%windir%\Sysnative\cmd.exe" /c "%~nx0"
      exit
    ) else (
      ;;; echo Предпринят запуск из-под 32-битного приложения.
      ;;; echo СТРОГО рекомендуется перезапустить скрипт
      ;;; echo из проводника Windows.
      ;;; echo Работа скрипта будет завершена.
      exit
    )
)
Exit /B 0

:GetOSBitness [out.var]
  Set "%~1=x64"& If /i "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set "%~1=x32"
Exit /B

:GetProcessBitness [in.OS.Bitness] [out.var]
  set "%~2=x32"& if "%~1"=="x64" echo "%PROGRAMFILES%" |>nul find /i "x86" || set "%~2=x64"
Exit /B
 
Dragokas, вопрос: если запускается процесс командной строкой,то достаточно ли будет контролировать перезапуск консоли?
 
Я имею это будет просто рекомендация запустить как положено?
Думаю может скриптом проводник изначально запускать.
Или вообще на vb переписать
 
Поудаляй все pause.
Добавь этот код в самое начало своего.
Он сам себя перезапустит, если определит, что битность процесса не совпадает с битностью ОС.

Единственное, что ты можешь наоборот добавить pause в конец вот этого сообщения:
;;; echo Предпринят запуск из-под 32-битного приложения.
;;; echo СТРОГО рекомендуется перезапустить скрипт
;;; echo из проводника Windows.
;;; echo Работа скрипта будет завершена.

Это может случится только в одном случае - запуск на XP x64, на который не установлено вот это обновление: http://support.microsoft.com/kb/942589
 
Это может случится только в одном случае - запуск на XP x64, на который не установлено вот это обновление: http://support.microsoft.com/kb/942589
Это вообще маловероятно)))

Допилю обновление и это тоже добавлю в скрипт.
Над тем,что бы через explorer стартовать тоже подумаю.

Спасибо за помощь)
 
Koza Nozdri, только учти, что если ты откроешь папку (explorer.exe) через свой скрипт, то он тоже запустится под WOW64 (т.е. 32-разрядным),
поэтому все делать нужно только через алиас Sysnative. К чему сложности, если все и так делается на автомате...
 
Назад
Сверху Снизу