Добрый вечер всем, Мне нужно воспользоватся айпишной функцией TerminateProcess, однако она требует хэндл процесса, но я знаю только его имя, то, которое отображает Windows Task Manager, например "winamp.exe" или "ICQLite.exe". По идее должна быть соответсвующая фунцкия, но я ее не нашел.. Подскажите плиз
сначала ищешь соответствуещее окно, потом ищешь процесс, к которому это окно относится, потом прибиваешь процесс используемые API: FindWindow, GetWindowThreadProcessId, OpenProcess, TerminateProcess
Jupiter В моем случае окна нету. На самом деле я собираюсь удалять процесс который как демон, например прогу SwitchOff которая ждет определенного времени потом выключает комп, ее постоянно запускает один чувак я хочу сделать прогу которая постоянно будет удалять этот процесс (т.е. завершать программу) если он запущен. asd спасибо, жаль что нет функции типа HANDLE GetProcessHandleByName( strName ), просто я посмотрел, там прийдется заполнять структуру PROCESSENTRY32, а у меня пока трудности с этим, там еще по идее нужно создать array (TCHAR szExeFile[MAX_PATH]. Буду экспериментировать.
в твоём собственном примере ты упомянул проги, у которых есть окна (можно искать по классу окна): писал бы сразу, что:
Ты не прав. Структуру не надо заполнять, в ней как раз и вернутся все нужные тебе данные. Делаешь снимок системы: CreateToolhelp32Snapshot. Потом вызываешь Process32First для первого процесса, а потом в цикле вызываешь Process32Next и проверяешь pe32.szExeFile на имя твоего демона.
n0name Сделал, код (для тестирования) должен выводить имя первого процесса, но не выводит - функция Process32First выдает почемуто FALSE, кому не трудно укажите пожалуйста ошибку(и). Возможно я не правильно инициализирую данные.. не пойму.. При писании кода я также ориентировался по http://www.developerfusion.co.uk/show/4073/ - там на другом языке написано но понятно. Код (Text): format PE GUI 4.0 entry EntryPoint include '%fasminc%/win32a.inc' TH32CS_SNAPHEAPLIST = 1h TH32CS_SNAPPROCESS = 2h TH32CS_SNAPTHREAD = 4h TH32CS_SNAPMODULE = 8h TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE) section '.data' data readable writeable sMessage db 'This is the message', 0 sTitle db 'Message', 0 hSnapShot dd 0 struct PROCESSENTRY32 dwSize dd 0 cntUsage dd 0 th32ProcessID dd 0 th32DefaultHeapID dd 0 th32ModuleID dd 0 cntThreads dd 0 pcPriClassBase dd 0 dwFlags dd 0 szExeFile db 100 dup (?) ends uProcess PROCESSENTRY32 section '.code' code readable executable EntryPoint: invoke CreateToolhelp32Snapshot, TH32CS_SNAPALL, 0 mov [hSnapShot], eax mov [uProcess.dwSize], sizeof.PROCESSENTRY32 @@: invoke Process32First, hSnapShot, uProcess cmp eax, FALSE je @F invoke MessageBox, NULL, uProcess.szExeFile, sTitle, MB_OK @@: invoke CloseHandle, hSnapShot invoke ExitProcess, NULL section '.idata' import data readable library kernel32, 'KERNEL32.DLL',\ user32, 'USER32.DLL',\ shell32, 'SHELL32.DLL' include '%fasminc%/apia/kernel32.inc' include '%fasminc%/apia/user32.inc'
ты прав, но все же не догоняю, он говорит: The program issued a command, but the command length is incorrect. предполагаю что комманда это Process32First, но причем тут command length.. она принимает два параметра, все вроде бы правильно.. думаю я чтото не то делаю с struct. вот новый код с GetLastError Код (Text): format PE GUI 4.0 entry EntryPoint include '%fasminc%/win32a.inc' TH32CS_SNAPHEAPLIST = 1h TH32CS_SNAPPROCESS = 2h TH32CS_SNAPTHREAD = 4h TH32CS_SNAPMODULE = 8h TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE) section '.data' data readable writeable sMessage db 'This is the message', 0 sTitle db 'Message', 0 sbError db 100 dup (0) hSnapShot dd 0 struct PROCESSENTRY32 dwSize dd 0 cntUsage dd 0 th32ProcessID dd 0 th32DefaultHeapID dd 0 th32ModuleID dd 0 cntThreads dd 0 pcPriClassBase dd 0 dwFlags dd 0 szExeFile db 100 dup (?) ends uProcess PROCESSENTRY32 section '.code' code readable executable EntryPoint: invoke CreateToolhelp32Snapshot, TH32CS_SNAPALL, 0 mov [hSnapShot], eax mov [uProcess.dwSize], sizeof.PROCESSENTRY32 @@: invoke Process32First, hSnapShot, uProcess cmp eax, FALSE je @F invoke MessageBox, NULL, uProcess.szExeFile, sTitle, MB_OK @@: invoke GetLastError invoke FormatMessage, FORMAT_MESSAGE_FROM_SYSTEM, NULL, eax, NULL, sbError, 100, FORMAT_MESSAGE_ARGUMENT_ARRAY invoke MessageBox, NULL, sbError, sTitle, MB_OK invoke CloseHandle, hSnapShot invoke ExitProcess, NULL section '.idata' import data readable library kernel32, 'KERNEL32.DLL',\ user32, 'USER32.DLL',\ shell32, 'SHELL32.DLL' include '%fasminc%/apia/kernel32.inc' include '%fasminc%/apia/user32.inc'
Попробуй не TH32CS_SNAPALL, а TH32CS_SNAPPROCESS и у тебя в структуре не хватает члена th32ParentProcessID DWORD ? PROCESSENTRY32 STRUCT dwSize DWORD ? cntUsage DWORD ? th32ProcessID DWORD ? th32DefaultHeapID DWORD ? th32ModuleID DWORD ? cntThreads DWORD ? th32ParentProcessID DWORD ? pcPriClassBase DWORD ? dwFlags DWORD ? szExeFile db MAX_PATH dup(?) PROCESSENTRY32 ENDS
Проверил, я действительно пропустил один параметр при создании struct, и поменял на TH32CS_SNAPPROCESS, но все равно не работает.. значит у меня было больше одного бага, думаю я неправильно инициализирую данные в struct, не знаю если типы LONG и ULONG_PTR являются в ассемблере dd, т.е. dword-ами. Код (Text): typedef struct tagPROCESSENTRY32 { DWORD dwSize; DWORD cntUsage; DWORD th32ProcessID; ULONG_PTR th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads; DWORD th32ParentProcessID; LONG pcPriClassBase; DWORD dwFlags; TCHAR szExeFile[MAX_PATH]; } PROCESSENTRY32, *PPROCESSENTRY32; вот последняя версия.. Код (Text): format PE GUI 4.0 entry EntryPoint include '%fasminc%/win32a.inc' TH32CS_SNAPHEAPLIST = 1h TH32CS_SNAPPROCESS = 2h TH32CS_SNAPTHREAD = 4h TH32CS_SNAPMODULE = 8h TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE) section '.data' data readable writeable sMessage db 'This is the message', 0 sTitle db 'Message', 0 sbError db 100 dup (0) hSnapShot dd 0 struct PROCESSENTRY32 dwSize dd 0 cntUsage dd 0 th32ProcessID dd 0 th32DefaultHeapID dd 0 th32ModuleID dd 0 cntThreads dd 0 th32ParentProcessID dd 0 pcPriClassBase dd 0 dwFlags dd 0 szExeFile db 100 dup (?) ends uProcess PROCESSENTRY32 section '.code' code readable executable EntryPoint: invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0 mov [hSnapShot], eax mov [uProcess.dwSize], sizeof.PROCESSENTRY32 @@: invoke Process32First, hSnapShot, uProcess cmp eax, FALSE je @F invoke MessageBox, NULL, uProcess.szExeFile, sTitle, MB_OK @@: invoke GetLastError invoke FormatMessage, FORMAT_MESSAGE_FROM_SYSTEM, NULL, eax, NULL, sbError, 100, FORMAT_MESSAGE_ARGUMENT_ARRAY invoke MessageBox, NULL, sbError, sTitle, MB_OK invoke CloseHandle, hSnapShot invoke ExitProcess, NULL section '.idata' import data readable library kernel32, 'KERNEL32.DLL',\ user32, 'USER32.DLL',\ shell32, 'SHELL32.DLL' include '%fasminc%/apia/kernel32.inc' include '%fasminc%/apia/user32.inc'
Код (Text): struct PROCESSENTRY32 dwSize dd 0 cntUsage dd 0 th32ProcessID dd 0 th32DefaultHeapID dd 0 th32ModuleID dd 0 cntThreads dd 0 th32ParentProcessID dd 0 pcPriClassBase dd 0 dwFlags dd 0 [b] szExeFile db 260 dup (?)[/b] ends invoke CreateToolhelp32Snapshot, 2, 0 mov [hSnapShot], eax mov [uProcess.dwSize], 128h @@: [b] invoke Process32First, [hSnapShot], uProcess[/b] test eax, eax jz @F
Хотел выделить строки с изменениями, но не получилось. В общем второй раз за день поправляю, что в фасме, в отличие от масма, просто запись переменной эквивалентно записи её смещения, и чтобы обратиться к ней, надо заключать её в []. Это первый косяк, второй в том что ты неверно задал структуру, кто сказал тебе что под szExeFile выделено 100 байт? На самом деле под неё выделяется MAX_PATH.
Ррррработает!!! Ура!! Спасибо!! Код (Text): format PE GUI 4.0 entry EntryPoint include '%fasminc%/win32a.inc' TH32CS_SNAPHEAPLIST = 1h TH32CS_SNAPPROCESS = 2h TH32CS_SNAPTHREAD = 4h TH32CS_SNAPMODULE = 8h TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE) section '.data' data readable writeable sMessage db 'This is the message', 0 sTitle db 'Message', 0 sbError db 100 dup (0) hSnapShot dd 0 struct PROCESSENTRY32 dwSize dd 0 cntUsage dd 0 th32ProcessID dd 0 th32DefaultHeapID dd 0 th32ModuleID dd 0 cntThreads dd 0 th32ParentProcessID dd 0 pcPriClassBase dd 0 dwFlags dd 0 szExeFile db 260 dup (?) ends uProcess PROCESSENTRY32 section '.code' code readable executable EntryPoint: invoke CreateToolhelp32Snapshot, TH32CS_SNAPALL, 0 mov [hSnapShot], eax mov [uProcess.dwSize], sizeof.PROCESSENTRY32 invoke Process32First, [hSnapShot], uProcess cmp eax, FALSE je doExit @@: invoke Process32Next, [hSnapShot], uProcess cmp eax, FALSE je @F invoke MessageBox, NULL, uProcess.szExeFile, sTitle, MB_OK jmp @B @@: doExit: invoke GetLastError invoke FormatMessage, FORMAT_MESSAGE_FROM_SYSTEM, NULL, eax, NULL, sbError, 100, FORMAT_MESSAGE_ARGUMENT_ARRAY invoke MessageBox, NULL, sbError, sTitle, MB_OK invoke CloseHandle, hSnapShot invoke ExitProcess, NULL section '.idata' import data readable library kernel32, 'KERNEL32.DLL',\ user32, 'USER32.DLL',\ shell32, 'SHELL32.DLL' include '%fasminc%/apia/kernel32.inc' include '%fasminc%/apia/user32.inc'