Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2010, 02:05   #1
semiono
Пользователь
 
Регистрация: 03.10.2010
Сообщений: 14
Вопрос Оболочка для запуска приложения.

Hello World! Мне нужно написать эмуляцию батника. (fasm, masm32... дальше лучше не надо...)

%WinDir%\system32\ml.cmd:
%SystemDrive%\masm32\bin\ml.exe %*

Хочу обратить внимание на %* ввод параметров не програмно!
Запуск из консоли не должен открывать новую консоль.
Пример может быть любым, не обязательно ml.exe. Но приложение интересует консольное с параметрами.

invoke ShellExecute, тут не подходит, ShellExecuteEx может быть, но я не компитентный тут.
Возможно тут может понадобиться WaitForSingleObject() ?

Вообщем помогите.
semiono вне форума Ответить с цитированием
Старый 03.10.2010, 10:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
invoke ShellExecute, тут не подходит
cinvoke system из msvcrt.dll
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.10.2010, 16:28   #3
xrnd
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 18
По умолчанию

Можно использовать
CreateProcess()+WaitForSingleObject ()
xrnd вне форума Ответить с цитированием
Старый 03.10.2010, 22:13   #4
semiono
Пользователь
 
Регистрация: 03.10.2010
Сообщений: 14
По умолчанию

Stilet, Вы как всегда лаконичны!
xrnd, я подумаю над этим.

А может у кого-то есть развёрнутый код как пример? Я уже пол недели бьюсь,
зарылся в ShellExecuteEx() CreateProcess() ничего не получается...


Код:
format PE Console
include '%fasm%/win32ax.inc'
section '.code' executable
start:
        invoke GetCommandLine
        mov ebx,eax
@@:
        cmp byte [ebx],0
        je  @sh
        cmp byte [ebx],' '
        je  @f
        inc ebx
        jmp @r
@@:
        inc ebx
        cmp byte [ebx],' '
        je  @r
 
        mov [SystemInfo.cb],sizeof.STARTUPINFO
        invoke GetStartupInfo,SystemInfo
        or [SystemInfo.dwFlags],STARTF_USESHOWWINDOW
        mov [SystemInfo.wShowWindow],SW_HIDE
@sh:
        invoke ExpandEnvironmentStrings,'%WinDir%\system32\ping.exe',exec,MAX_PATH
        invoke CreateProcess,exec,ebx,NULL,NULL,FALSE,\
               NORMAL_PRIORITY_CLASS,NULL,NULL,SystemInfo,ProcessInfo
        or eax,eax
        jnz @f
        invoke WaitForSingleObject,ProcessInfo.hProcess,15000
@@:
        cmp eax,WAIT_OBJECT_0
        jnz @f
        ;Success
@@:
        cmp eax,WAIT_TIMEOUT
        jnz @f
        ;Failure (Timed out)
@@:
        invoke CloseHandle,ProcessInfo.hProcess
        invoke CloseHandle,ProcessInfo.hThread
exit:
        invoke ExitProcess,NULL
 
.end start
 
section '.data' readable writeable
 
        SystemInfo STARTUPINFO
        ProcessInfo PROCESS_INFORMATION
 
        exec dd ?
Тут я с парсингом не доразобрался. Но мне кажется здесь WaitForSingleObject не правильно работает, вообщем подвисает консоль.
Но меня более интересует, неужели нет стандартного кода на такую простую
процедуру, ато потом обноружится, что я велосипед изобретаю...
Лучше бы кто-то опытный это написл. ?? А я бы посмотрел. (kernel я уж потом сам буду осваивать) ))

Последний раз редактировалось semiono; 03.10.2010 в 22:16.
semiono вне форума Ответить с цитированием
Старый 04.10.2010, 00:32   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Не понятно, чего именно не понятно. Командную строку что ли парсить не получается, или процесс запустить?

Вот примерчик на масме как запустить процесс. Примерчик с вашего списан, но работает. Командная строка программки ShCons.exe получается аналогичной команде ping.
Вложения
Тип файла: rar ShellCons.rar (2.0 Кб, 15 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 04.10.2010, 03:33   #6
semiono
Пользователь
 
Регистрация: 03.10.2010
Сообщений: 14
По умолчанию

Ulex, огромнейшее спасибо!!!!!
У меня практически получился fasm. Но есть вопросы.
Где-то я всётаки потерял вывод ошибок на экран. wmcommand_ID1_err2:
Думаю что из-за этого:
Код:
        mov     [startSTR.cb], SIZEOF STARTUPINFO
Код:
; fasm
        mov [startSTR.cb],sinfo
...
section '.data' readable

        sinfo STARTUPINFO
Либо я чего-то просто не понял пока.

Хотя если подумать, проблемма должна быть тут
Код:
next_find1:
        cmp     byte ptr [eax], 0
        je      wmcommand_ID1_err2
Но я всего лишь ptr убрал, что для fasm должно быть верно.

-->8--

Константу пришлось определить самому, не знаю валидно ли.
Код:
        INFINITE dd 0xffffffff
Ещё меня интересует, можно ли так делать: (null-terminated string)
Код:
        invoke ExpandEnvironmentStrings,'%WinDir%\system32\ping.exe',exec,MAX_PATH
Или тут нуль как закрытие строки теряется? Или это допустимо?

И вот ещё одна моя самодеятельность, правильно ли? -
Код:
exec db MAX_PATH dup ?
BTW, ещё одна вещь которая не даёт мне покоя
вот если надо определить такое
exec db 'c:\i\system32\ping.exe ',0
но не инициализировать? (null-terminated string)
exec dd ?,0
так чтоли?

Последний раз редактировалось semiono; 04.10.2010 в 03:48.
semiono вне форума Ответить с цитированием
Старый 05.10.2010, 01:10   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Цитата:
Ещё меня интересует, можно ли так делать: (null-terminated string)
Код:

invoke ExpandEnvironmentStrings,'%WinDir%\ system32\ping.exe',exec,MAX_PATH
Или тут нуль как закрытие строки теряется? Или это допустимо?
Да вроде допустимо, если подключен win32ax.inc. Если подключен win32a.inc, то компилятор выругается.


Цитата:
И вот ещё одна моя самодеятельность, правильно ли? -
Код:

exec db MAX_PATH dup ?
Ну а почему бы и нет? нормально

А вообще вопросов много - отвечать лень. Я просто исходник на фасм переделал. Вроде работает.
Вложения
Тип файла: rar ShellCons.rar (1.6 Кб, 15 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 05.10.2010, 18:37   #8
semiono
Пользователь
 
Регистрация: 03.10.2010
Сообщений: 14
По умолчанию

Спасибо! Исходник отлично работает!
semiono вне форума Ответить с цитированием
Старый 08.10.2010, 00:48   #9
semiono
Пользователь
 
Регистрация: 03.10.2010
Сообщений: 14
По умолчанию

Код:
        invoke GetSystemMetrics,SM_CXSCREEN
        mov [x],eax
        cmp eax,800
        jne @f
        invoke RegCreateKeyEx,HKCU,'Console',NULL,NULL,REGT,KEY_WRITE,NULL,phkResult,NULL
; ...
        invoke RegSetValueEx,[phkResult],'WindowPosition',NULL,REG_DWORD,@001c004e,4
        invoke RegSetValueEx,[phkResult],'WindowSize',NULL,REG_DWORD,@0012003a,4
        invoke RegCloseKey,[phkResult]
        jmp sh
; ...

section '.data' readable
        HKCU = HKEY_CURRENT_USER
        REGT = REG_OPTION_NON_VOLATILE
format PE Console
У меня вопрос, почему только после перезагрузки консоли, то-есть со второго раза, консоль открывается согласно настройкам в реестре?
Что можно предпринять? Invoke Sleep,1000 тут тоже не причём.


Попытался переделать.
Код:
        mov [StartSTR.cb],sinfo
        mov [StartSTR.dwFlags],STARTF_USEPOSITION+STARTF_USESIZE ;STARTF_USESTDHANDLES
;~
        mov dword [StartSTR.dwX],0x0
        mov dword [StartSTR.dwY],0x1c
        mov dword [StartSTR.dwXSize],0x50
        mov dword [StartSTR.dwYSize],0x19

        invoke ExpandEnvironmentStrings,'%ProgramFiles%\Far\Far.exe',exec,MAX_PATH
        invoke CreateProcess,exec,[rlcc],NULL,NULL,\
               CREATE_NEW_CONSOLE,NORMAL_PRIORITY_CLASS,NULL,NULL,StartSTR,StartInfo ;DETACHED_PROCESS
Но не работает почемуто.

Последний раз редактировалось semiono; 08.10.2010 в 03:45.
semiono вне форума Ответить с цитированием
Старый 08.10.2010, 17:19   #10
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Честно говоря не очень понятно чего вы хотите сделать в конечном итоге.

Попробуйте вот эти функции:
SetConsoleWindowInfo
SetConsoleScreenBufferSize
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ветвление + простая оболочка запуска. as3k Общие вопросы C/C++ 0 08.05.2010 15:04
Параметры запуска приложения lmiol Помощь студентам 0 04.05.2010 22:10
Параметры запуска приложения Zeraim Свободное общение 2 26.01.2010 20:20
проблема запуска приложения Mazaxaka Общие вопросы Delphi 2 27.03.2009 14:51
Ошибка запуска приложения Killer_djon БД в Delphi 3 21.12.2007 10:33