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

Кирилл

Команда форума
Администратор
Сообщения
14,056
Реакции
6,109
Баллы
993
Вопрос в названии темы,описание проблемы тут:
http://safezone.cc/threads/obzor-utility-sfc-exe.18934/page-2#post-210190

Подозреваю что все гениальное просто,а то я в такие дебри ухожу,что ... лучше совет профи))
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,320
Реакции
5,788
Баллы
718
Делал такой перезапуск процесса в проекте 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
 

Кирилл

Команда форума
Администратор
Сообщения
14,056
Реакции
6,109
Баллы
993
Dragokas, вопрос: если запускается процесс командной строкой,то достаточно ли будет контролировать перезапуск консоли?
 

Кирилл

Команда форума
Администратор
Сообщения
14,056
Реакции
6,109
Баллы
993
Я имею это будет просто рекомендация запустить как положено?
Думаю может скриптом проводник изначально запускать.
Или вообще на vb переписать
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,320
Реакции
5,788
Баллы
718
Поудаляй все pause.
Добавь этот код в самое начало своего.
Он сам себя перезапустит, если определит, что битность процесса не совпадает с битностью ОС.

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

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

Кирилл

Команда форума
Администратор
Сообщения
14,056
Реакции
6,109
Баллы
993
Это может случится только в одном случае - запуск на XP x64, на который не установлено вот это обновление: http://support.microsoft.com/kb/942589
Это вообще маловероятно)))

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

Спасибо за помощь)
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,320
Реакции
5,788
Баллы
718
Koza Nozdri, только учти, что если ты откроешь папку (explorer.exe) через свой скрипт, то он тоже запустится под WOW64 (т.е. 32-разрядным),
поэтому все делать нужно только через алиас Sysnative. К чему сложности, если все и так делается на автомате...
 
Сверху Снизу