· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› CreateProcess

Посл.отвђт Сообщенiе


Дата: Авг 23, 2003 15:59:56

Дайте кто-нибудь, пожалуйста, описание структуры, а лучше весь .inc файл для CreateProcess.

И вот ещё, я нашла описание этой функции:
BOOL CreateProcess(
LPCTSTR lpApplicationName // pointer to name of executable module
LPTSTR lpCommandLine // pointer to command line string
...);
Но в ассемблерных листингах первый параметр ноль, а второй путь к exe-шнику, это у меня глупое описалово?


Дата: Авг 23, 2003 17:03:23

Не совсем понятно, описание какой структуры нужно. CreateProcess это функция и принимает довольно много параметров. Описание в MSDN, API Reference или просто в сети поискать. инклуды есть в \masm32\include\windows.inc.

Касательно двух первых параметров, там действительно немного запутано. Очень хорошо о них рассказано в книге Джеффри Рихтера.

Вот пример:
.386
.model flat, stdcall
option casemap:none
	
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

.data
szNotepad	db "\Notepad.exe", 0
StartupInfo	STARTUPINFO			<0>
ProcessInfo	PROCESS_INFORMATION	<0>
buffer		db	MAX_PATH	dup(0)
.code
start:
	invoke GetSystemDirectory, addr buffer, sizeof buffer
	invoke lstrcat, addr buffer, addr szNotepad
	mov StartupInfo.cb, sizeof STARTUPINFO
	invoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL,NULL, addr StartupInfo, addr ProcessInfo
	ret
end start


Дата: Авг 23, 2003 18:58:25

Да, но мне нужен инклуд для TASMa, тот в котором описана STARTUPINFO и др.


Дата: Авг 23, 2003 19:41:19

Four-F
В MSDN рекомендуют использовать второй параметр (lpCommandLine) для совместимости с приложениями, которые активно используют командную строку. Поэтому я всегда ставлю первым параметром ноль, а вторым -- короткий путь к модулю и параметры (если есть). Кстати, это особенно актуально для запуска Java-приложений из GUI-программы.

Misty
тот в котором описана STARTUPINFO и др
Можно просто объявлять массив байт без структуры. Например (MASM, но вы сможете переделать под TASM):
.DATA
sDir  db "C:\mydir",0
sCmd  db "C:\mydir\myexe param1 param2",0
sEnv  db "var1=val1",0,"var2=val2",0,0

.DATA?
SInfo db 68 dup (?) ; STARTUPINFO
PInfo db 16 dup (?) ; PROCESS_INFORMATION

.CODE
; . . .
   xor eax,eax
   mov DWORD PTR [SInfo],68        ; SIZEOF STARTUPINFO
   mov DWORD PTR [SInfo + 4],eax   ; lpReserved  = NULL
   mov DWORD PTR [SInfo + 8],eax   ; lpDesktop   = NULL
   mov DWORD PTR [SInfo + 12],eax  ; lpTitle     = NULL
   mov DWORD PTR [SInfo + 44],eax  ; dwFlags     = NULL
   mov DWORD PTR [SInfo + 52],eax  ; lpReserved2 = NULL
   invoke CreateProcess,eax,OFFSET sCmd,eax,eax,eax,\
	NORMAL_PRIORITY_CLASS,OFFSET sEnv,\
	OFFSET sDir,OFFSET SInfo,OFFSET PInfo
   test eax,eax
   jnz @F
   INFO "CreateProcess sucks!"
   jmp @the_end
@@:
   ; Ждём пока процесс отработает
   ; Timeout == 5 секунд
   invoke WaitForSingleObject,DWORD PTR [PInfo],5000
   push eax
   invoke CloseHandle,DWORD PTR [PInfo]
   pop eax
   cmp eax,WAIT_TIMEOUT
   je @F
   INFO "Процесс повис!"
   jmp @the_end
@@:
   INFO "Всё OK!"
@the_end
Инфу по недостающим полям STARTUPINFO и PROCESS_INFORMATION можно найти в MSDN.


Дата: Авг 24, 2003 00:16:37

[ Quantum: В MSDN рекомендуют использовать второй параметр... ]

Учту.


Дата: Авг 24, 2003 22:53:48

Four-F

Я всё думал, что-то меня в твоём примере смущает, потом допёр ;-),
полный путь к Notepad.exe->c:\windows\Notepad.exe, а функция
GetSystemDirectory даёт нам путь c:\windows\system\, поэтому нам
всё-таки нужна функция GetWindowsDirectory ;-)


Дата: Авг 25, 2003 00:02:18

Под 2000 и ХР (под NT4 и 2003, наверное тоже) блокнот лежит %SystemRoot%\system32\notepad.exe. Так что либо версию оси проверять, либо тупо GetSystemDirectory или GetWindowsDirectory.


Дата: Авг 25, 2003 00:13:49

Странно, а почему у меня notepad.exe лежит и в 2k и в XP в Виндовой директории?
Или он там дублируется?


Дата: Авг 25, 2003 00:34:12

Asterix
Или он там дублируется?
У меня тоже лежит и в C:\WINNT\ и в C:\WINNT\SYSTEM32


Дата: Авг 25, 2003 00:58:25

Мистика :)


Дата: Авг 25, 2003 10:45:01 · Поправил: Four-F

Да. У меня тоже. Прикольно.
Кстати, regedit лежит в %SystemRoot%\, а calc в %SystemRoot%\System32\.
Т.е. калькулятор более "систем" чем редактор реестра ;-)


Дата: Авг 26, 2003 13:54:13

И ещё, когда я попытался удалить notepad.exe из виндовой директории,
помоему в ХР, то он там всё равно появлялся опять!


Дата: Авг 26, 2003 15:15:19

Asterix а ты бы его еще и из dllcache удалил :)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.139