Страница 8 из 9

Добавлено: Вт янв 24, 2012 23:33
Flasher
gora
Ну почему же сомнительно? Кто-то привык к тому имени, у кого-то пути в командах, кнопках, ключах wincmd.ini прямые указаны, причин хватает.

В общем, я пока только одно могу предложить. %COMMANDER_PATH% + exe. По логике никто не будет там держать exe-файлы, из которых будет запускаться ТС. Устроит?

Добавлено: Вт янв 24, 2012 23:36
gora
Flasher писал(а):Устроит?
Пока не вижу, ответить не могу.

Добавлено: Вт янв 24, 2012 23:38
Flasher
gora
А зачем видеть? Я родительскую папку процесса сравниваю с %C_P% и проверяю расширение. Если совпало, то это наш ТС.

Добавлено: Вт янв 24, 2012 23:53
Samwatas
Или какой-то левый экзешник (например, инсталлятор), которому не повезло дважды - он лежал в папке %C_P% и запустил vbs-скрипт для определения битности. А тут бац! - его обозвали тоталом и проверяют его битность.

Добавлено: Ср янв 25, 2012 00:00
Flasher
Такого не будет, потому что скрипт поймает первого попавшегося в цепочке, а не абы где.

Добавлено: Ср янв 25, 2012 00:06
Samwatas
Этот горе-экзешник и будет первым попавшимся в цепочке (поскольку именно он запустил скрипт)

Добавлено: Ср янв 25, 2012 00:14
Flasher
Samwatas
А зачем его ему запускать? Это пользователь определяет, делать ему это или нет.

gora, короче, дело к ночи..

Код: Выделить всё

' Записать битность TC в файл рядом со скриптом
PTC = CreateObject("WScript.Shell").Environment("Process")("COMMANDER_PATH")
If PTC = "" Then WScript.Quit
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
For Each P in WMI.ExecQuery("SELECT ParentProcessId FROM Win32_Process WHERE ExecutablePath Like '" &_
Replace(WScript.FullName,"\","\\")& "'")
  Parent = P.ParentProcessId
Next
Do Until StrComp(TCP, PTC, 1) = 0 And StrComp(FSO.GetExtensionName(Name), "exe", 1) = 0 And Size > 1000000
  For Each P in WMI.ExecQuery("SELECT Caption, ExecutablePath, ParentProcessId FROM Win32_Process WHERE ProcessId Like " & Parent)
    Name   = P.Caption
    TC     = P.ExecutablePath
    Parent = P.ParentProcessId
  Next
  TCP = FSO.GetParentFolderName(TC)
  Size = FSO.GetFile(TC).Size
Loop
If Size < 7000000 Then Arch = "x32" Else Arch = "x64"
FSO.OpenTextFile(FSO.GetParentFolderName(WScript.ScriptFullName) & "\Arch.txt", 2, True).WriteLine Arch
Set FSO = Nothing : Set WMI = Nothing : WScript.Quit

Добавлено: Ср янв 25, 2012 08:35
gora
Flasher
Добавил в Ваш скрипт строку:

Код: Выделить всё

MsgBox TC & "," & Arch
в предпоследнюю строчку, положил его НE в папку ТС и запустил:
1 из ком строки ТС, нажав Enter -

Код: Выделить всё

---------------------------

---------------------------
E:\totalcmd64\Totalcmd64.exe,x64
---------------------------
ОК   
---------------------------
2 из ком строки TC, нажав Shift+Enter -

Код: Выделить всё

---------------------------

---------------------------
E:\totalcmd64\noclose64.exe,x32
---------------------------
ОК   
---------------------------

Добавлено: Ср янв 25, 2012 09:11
Samwatas
А разве есть x64 сжатый? Вроде Гислер отказался выпускать в таком виде. Последняя версия - 7.56a.
А что, сжать экзешник может только Гислер? Другие не имеют достаточно знаний, чтобы скачать какой-нить UPX и самому упаковать (например, чтобы тотал занимал меньше места на флешке)?
Короче, подводя итоги:
Один из самых надежных методов - это определять окно тотала по имени класса (причем если у 64бит тотала имя класса отличается от 32битного, то таким образом можно сразу определить и разрядность процесса). Этот метод будет работать и на чистых дистрибутивах тотала и на разнообразных сборках, как бы они ни были модифицированы - можно менять имя экзешника, можно его упаковать UPX-ом, можно менять хаголовок окна разнообразными утилитами (коих целая куча, в том числе написанных специально для тотала) - класс окна будет неизменно показывать, что этот все тот же тотал.
VBS-скрипт требует целый ряд допущений чтобы выполнить ту же задачу (как говорится, "шаг вправо, шаг влево - попытка к бегству").
И, наконец, если допустить, что версия тотала будет 8б10 или выше, то автор справится и сам при помоши батника.
Весь вопрос в том, на какие допущения готов идти автор. Как я уже говорил, если нужен самый надежный метод и при этом хочется небольшой размер экзешника, то ему нужно писать приложение на С/С++ (тут речь будет идти на десятки килобайт, а если сжать, то и на единицы). Например, можно написать консольное приложение, которое будеть возвращать либо 32, либо 64.

Добавлено: Ср янв 25, 2012 09:48
gora
Samwatas писал(а):если у 64бит тотала имя класса отличается от 32битного
Класс окна одинаков для обеих версий (х64 и х86) - TTOTAL_CMD

Добавлено спустя 5 минут:
Samwatas писал(а):нужно писать приложение на С/С++
Я не программист, написать сам не смогу, а просить это сделать кого-то, специально для моей задачи, не считаю целесообразным.
Всем спасибо. Остановлюсь на варианте батника (с оговорками).

Добавлено спустя 20 минут:
Samwatas писал(а):Один из самых надежных методов - это определять окно тотала по имени класса
Строго говоря окна может и не быть. После запуска инсталлятора выводится окно диалога, может пройти достаточно много времени до запуска скрипта и ни кто не мешает пользователю закрыть окно ТС перед продолжением работы инсталлятора.

Добавлено: Ср янв 25, 2012 12:58
Flasher
gora писал(а):Добавил в Ваш скрипт строку:
В этом нет необходимости, txt-файл всё равно переписывается.
gora писал(а):2 из ком строки TC, нажав Shift+Enter -
Понятно. От консольных приложений можно спастись проверкой размера. Добавил.
Samwatas писал(а):А что, сжать экзешник может только Гислер? Другие не имеют достаточно знаний, чтобы скачать какой-нить UPX и самому упаковать (например, чтобы тотал занимал меньше места на флешке)?
Ок. Тогда просьба выложить сжатый TC8x64.
Samwatas писал(а):Короче, подводя итоги:
Один из самых надежных методов - это определять окно тотала по имени класса (причем если у 64бит тотала имя класса отличается от 32битного
Ага, один из безнадёжных:
gora писал(а):Класс окна одинаков для обеих версий (х64 и х86) - TTOTAL_CMD
Samwatas писал(а):VBS-скрипт требует целый ряд допущений чтобы выполнить ту же задачу (как говорится, "шаг вправо, шаг влево - попытка к бегству").
Какой ряд? Тот, что назван выше для данной задачи неуместен.
AutoIt-скрипт не требует допущений? Взять хотя бы большой размер и кучу библиотек.
Samwatas писал(а):И, наконец, если допустить, что версия тотала будет 8б10 или выше, то автор справится и сам при помоши батника.
Это было понятно ещё с начала топика.
Samwatas писал(а):Например, можно написать консольное приложение, которое будеть возвращать либо 32, либо 64.
Можно и на луну слетать при большом желании. :wink: Если это предложение реализации со своей стороны, то милости просим.

Добавлено: Ср янв 25, 2012 18:12
Rodny
Samwatas писал(а):А что, сжать экзешник может только Гислер? Другие не имеют достаточно знаний, чтобы скачать какой-нить UPX и самому упаковать (например, чтобы тотал занимал меньше места на флешке)?
Да, только Гислер. Самопроверку тотала никто не отменял:

Код: Выделить всё

WARNING: The TOTALCMD executable file is corrupted, possible VIRUS!
Totalcmd will close. Please run a virus scanner as soon as possible!

Добавлено: Ср янв 25, 2012 18:25
gora
Rodny писал(а):Да, только Гислер.
Сомневаюсь, что даже он сможет сделать TC x64 упакованным UPX-ом, ибо UPX не работает с x64 приложениями! ;)

Добавлено: Ср янв 25, 2012 18:30
Flasher
gora
Я поэтому и попросил упакованный файл. :wink:
Так что, вариант подошёл?

Добавлено: Ср янв 25, 2012 18:41
gora
Flasher писал(а):Так что, вариант подощёл?
Я и не знал, что Вы что-то меняли и потом я уже писал
gora писал(а):Остановлюсь на варианте батника (с оговорками).
Новый инсталлятор уже сделан и выложен в паблик.