Как получить хэндл процесса?

Тема в разделе "WASM.BEGINNERS", создана пользователем xlinuks, 23 сен 2006.

  1. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Добрый вечер всем,
    Мне нужно воспользоватся айпишной функцией TerminateProcess, однако она требует хэндл процесса, но я знаю только его имя, то, которое отображает Windows Task Manager, например "winamp.exe" или "ICQLite.exe". По идее должна быть соответсвующая фунцкия, но я ее не нашел.. Подскажите плиз
     
  2. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    530
    Адрес:
    Russia
    сначала ищешь соответствуещее окно, потом ищешь процесс, к которому это окно относится, потом прибиваешь процесс

    используемые API:
    FindWindow, GetWindowThreadProcessId, OpenProcess, TerminateProcess
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    CreateToolhelp32Snapshot ->Process32First/Next -> OpenProcess -> TerminateProcess
     
  4. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Jupiter
    В моем случае окна нету.
    На самом деле я собираюсь удалять процесс который как демон, например прогу SwitchOff которая ждет определенного времени потом выключает комп, ее постоянно запускает один чувак я хочу сделать прогу которая постоянно будет удалять этот процесс (т.е. завершать программу) если он запущен.
    asd спасибо, жаль что нет функции типа HANDLE GetProcessHandleByName( strName ), просто я посмотрел, там прийдется заполнять структуру PROCESSENTRY32, а у меня пока трудности с этим, там еще по идее нужно создать array (TCHAR szExeFile[MAX_PATH];). Буду экспериментировать.
     
  5. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    530
    Адрес:
    Russia
    в твоём собственном примере ты упомянул проги, у которых есть окна (можно искать по классу окна):
    писал бы сразу, что:
     
  6. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    сорри :P
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ты не прав. Структуру не надо заполнять, в ней как раз и вернутся все нужные тебе данные.
    Делаешь снимок системы: CreateToolhelp32Snapshot. Потом вызываешь Process32First для первого процесса, а потом в цикле вызываешь Process32Next и проверяешь pe32.szExeFile на имя твоего демона.
     
  8. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    n0name
    Сделал, код (для тестирования) должен выводить имя первого процесса, но не выводит - функция Process32First выдает почемуто FALSE, кому не трудно укажите пожалуйста ошибку(и). Возможно я не правильно инициализирую данные.. не пойму.. При писании кода я также ориентировался по http://www.developerfusion.co.uk/show/4073/ - там на другом языке написано но понятно.

    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. entry EntryPoint
    4. include '%fasminc%/win32a.inc'
    5.  
    6. TH32CS_SNAPHEAPLIST = 1h
    7. TH32CS_SNAPPROCESS = 2h
    8. TH32CS_SNAPTHREAD = 4h
    9. TH32CS_SNAPMODULE = 8h
    10. TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
    11.  
    12. section '.data' data readable writeable
    13.     sMessage db 'This is the message', 0
    14.     sTitle db 'Message', 0
    15.     hSnapShot dd 0
    16.     struct PROCESSENTRY32
    17.         dwSize dd 0
    18.         cntUsage dd 0
    19.         th32ProcessID dd 0
    20.         th32DefaultHeapID dd 0
    21.         th32ModuleID dd 0
    22.         cntThreads dd 0
    23.         pcPriClassBase dd 0
    24.         dwFlags dd 0
    25.         szExeFile db 100 dup (?)
    26.     ends
    27.    
    28.     uProcess PROCESSENTRY32
    29.  
    30. section '.code' code readable executable
    31. EntryPoint:
    32.  
    33.     invoke CreateToolhelp32Snapshot, TH32CS_SNAPALL, 0
    34.     mov [hSnapShot], eax
    35.     mov [uProcess.dwSize], sizeof.PROCESSENTRY32
    36.    
    37.     @@:
    38.         invoke Process32First, hSnapShot, uProcess
    39.         cmp eax, FALSE
    40.         je @F
    41.         invoke MessageBox, NULL, uProcess.szExeFile, sTitle, MB_OK
    42.     @@:
    43.    
    44.     invoke CloseHandle, hSnapShot
    45.     invoke ExitProcess, NULL
    46.  
    47.  
    48. section '.idata' import data readable
    49.  
    50.     library kernel32, 'KERNEL32.DLL',\
    51.             user32, 'USER32.DLL',\
    52.             shell32, 'SHELL32.DLL'
    53.  
    54.     include '%fasminc%/apia/kernel32.inc'
    55.     include '%fasminc%/apia/user32.inc'
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Для разнообразия написал бы вывод GetLastError'a.
     
  10. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    ты прав, но все же не догоняю, он говорит:
    The program issued a command, but the command length is incorrect.
    предполагаю что комманда это Process32First, но причем тут command length.. она принимает два параметра, все вроде бы правильно..
    думаю я чтото не то делаю с struct.

    вот новый код с GetLastError
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. entry EntryPoint
    4. include '%fasminc%/win32a.inc'
    5.  
    6. TH32CS_SNAPHEAPLIST = 1h
    7. TH32CS_SNAPPROCESS = 2h
    8. TH32CS_SNAPTHREAD = 4h
    9. TH32CS_SNAPMODULE = 8h
    10. TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
    11.  
    12. section '.data' data readable writeable
    13.     sMessage db 'This is the message', 0
    14.     sTitle db 'Message', 0
    15.     sbError db 100 dup (0)
    16.     hSnapShot dd 0
    17.     struct PROCESSENTRY32
    18.         dwSize dd 0
    19.         cntUsage dd 0
    20.         th32ProcessID dd 0
    21.         th32DefaultHeapID dd 0
    22.         th32ModuleID dd 0
    23.         cntThreads dd 0
    24.         pcPriClassBase dd 0
    25.         dwFlags dd 0
    26.         szExeFile db 100 dup (?)
    27.     ends
    28.    
    29.     uProcess PROCESSENTRY32
    30.  
    31. section '.code' code readable executable
    32. EntryPoint:
    33.  
    34.     invoke CreateToolhelp32Snapshot, TH32CS_SNAPALL, 0
    35.     mov [hSnapShot], eax
    36.     mov [uProcess.dwSize], sizeof.PROCESSENTRY32
    37.    
    38.     @@:
    39.         invoke Process32First, hSnapShot, uProcess
    40.         cmp eax, FALSE
    41.         je @F
    42.         invoke MessageBox, NULL, uProcess.szExeFile, sTitle, MB_OK
    43.     @@:
    44.     invoke GetLastError
    45.     invoke FormatMessage, FORMAT_MESSAGE_FROM_SYSTEM, NULL, eax, NULL, sbError, 100, FORMAT_MESSAGE_ARGUMENT_ARRAY
    46.     invoke MessageBox, NULL, sbError, sTitle, MB_OK
    47.    
    48.     invoke CloseHandle, hSnapShot
    49.     invoke ExitProcess, NULL
    50.  
    51.  
    52. section '.idata' import data readable
    53.  
    54.     library kernel32, 'KERNEL32.DLL',\
    55.             user32, 'USER32.DLL',\
    56.             shell32, 'SHELL32.DLL'
    57.  
    58.     include '%fasminc%/apia/kernel32.inc'
    59.     include '%fasminc%/apia/user32.inc'
     
  11. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Попробуй не 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
     
  12. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Проверил, я действительно пропустил один параметр при создании struct, и поменял на TH32CS_SNAPPROCESS, но все равно не работает.. значит у меня было больше одного бага, думаю я неправильно инициализирую данные в struct, не знаю если типы LONG и ULONG_PTR являются в ассемблере dd, т.е. dword-ами.
    Код (Text):
    1. typedef struct tagPROCESSENTRY32 {
    2.   DWORD dwSize;
    3.   DWORD cntUsage;
    4.   DWORD th32ProcessID;
    5.   ULONG_PTR th32DefaultHeapID;
    6.   DWORD th32ModuleID;
    7.   DWORD cntThreads;
    8.   DWORD th32ParentProcessID;
    9.   LONG pcPriClassBase;
    10.   DWORD dwFlags;
    11.   TCHAR szExeFile[MAX_PATH];
    12. } PROCESSENTRY32, *PPROCESSENTRY32;
    вот последняя версия.. :dntknw:
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. entry EntryPoint
    4. include '%fasminc%/win32a.inc'
    5.  
    6. TH32CS_SNAPHEAPLIST = 1h
    7. TH32CS_SNAPPROCESS = 2h
    8. TH32CS_SNAPTHREAD = 4h
    9. TH32CS_SNAPMODULE = 8h
    10. TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
    11.  
    12. section '.data' data readable writeable
    13.     sMessage db 'This is the message', 0
    14.     sTitle db 'Message', 0
    15.     sbError db 100 dup (0)
    16.     hSnapShot dd 0
    17.     struct PROCESSENTRY32
    18.         dwSize dd 0
    19.         cntUsage dd 0
    20.         th32ProcessID dd 0
    21.         th32DefaultHeapID dd 0
    22.         th32ModuleID dd 0
    23.         cntThreads dd 0
    24.         th32ParentProcessID dd 0
    25.         pcPriClassBase dd 0
    26.         dwFlags dd 0
    27.         szExeFile db 100 dup (?)
    28.     ends
    29.    
    30.     uProcess PROCESSENTRY32
    31.  
    32. section '.code' code readable executable
    33. EntryPoint:
    34.  
    35.     invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
    36.     mov [hSnapShot], eax
    37.     mov [uProcess.dwSize], sizeof.PROCESSENTRY32
    38.    
    39.     @@:
    40.         invoke Process32First, hSnapShot, uProcess
    41.         cmp eax, FALSE
    42.         je @F
    43.         invoke MessageBox, NULL, uProcess.szExeFile, sTitle, MB_OK
    44.     @@:
    45.     invoke GetLastError
    46.     invoke FormatMessage, FORMAT_MESSAGE_FROM_SYSTEM, NULL, eax, NULL, sbError, 100, FORMAT_MESSAGE_ARGUMENT_ARRAY
    47.     invoke MessageBox, NULL, sbError, sTitle, MB_OK
    48.    
    49.     invoke CloseHandle, hSnapShot
    50.     invoke ExitProcess, NULL
    51.  
    52.  
    53. section '.idata' import data readable
    54.  
    55.     library kernel32, 'KERNEL32.DLL',\
    56.             user32, 'USER32.DLL',\
    57.             shell32, 'SHELL32.DLL'
    58.  
    59.     include '%fasminc%/apia/kernel32.inc'
    60.     include '%fasminc%/apia/user32.inc'
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1.     struct PROCESSENTRY32
    2.         dwSize dd 0
    3.         cntUsage dd 0
    4.         th32ProcessID dd 0
    5.         th32DefaultHeapID dd 0
    6.         th32ModuleID dd 0
    7.         cntThreads dd 0
    8.         th32ParentProcessID dd 0
    9.         pcPriClassBase dd 0
    10.         dwFlags dd 0
    11. [b]        szExeFile db 260 dup (?)[/b]
    12.     ends
    13.  
    14.     invoke CreateToolhelp32Snapshot, 2, 0
    15.     mov [hSnapShot], eax
    16.     mov [uProcess.dwSize], 128h
    17.    
    18.     @@:
    19. [b]        invoke Process32First, [hSnapShot], uProcess[/b]
    20.         test eax, eax
    21.         jz @F
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Хотел выделить строки с изменениями, но не получилось.
    В общем второй раз за день поправляю, что в фасме, в отличие от масма, просто запись переменной эквивалентно записи её смещения, и чтобы обратиться к ней, надо заключать её в []. Это первый косяк, второй в том что ты неверно задал структуру, кто сказал тебе что под szExeFile выделено 100 байт? На самом деле под неё выделяется MAX_PATH.
     
  15. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Ррррработает!!! Ура!! Спасибо!!
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. entry EntryPoint
    4. include '%fasminc%/win32a.inc'
    5.  
    6. TH32CS_SNAPHEAPLIST = 1h
    7. TH32CS_SNAPPROCESS = 2h
    8. TH32CS_SNAPTHREAD = 4h
    9. TH32CS_SNAPMODULE = 8h
    10. TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
    11.  
    12. section '.data' data readable writeable
    13.     sMessage db 'This is the message', 0
    14.     sTitle db 'Message', 0
    15.     sbError db 100 dup (0)
    16.     hSnapShot dd 0
    17.     struct PROCESSENTRY32
    18.         dwSize dd 0
    19.         cntUsage dd 0
    20.         th32ProcessID dd 0
    21.         th32DefaultHeapID dd 0
    22.         th32ModuleID dd 0
    23.         cntThreads dd 0
    24.         th32ParentProcessID dd 0
    25.         pcPriClassBase dd 0
    26.         dwFlags dd 0
    27.         szExeFile db 260 dup (?)
    28.     ends
    29.    
    30.     uProcess PROCESSENTRY32
    31.  
    32. section '.code' code readable executable
    33. EntryPoint:
    34.  
    35.     invoke CreateToolhelp32Snapshot, TH32CS_SNAPALL, 0
    36.     mov [hSnapShot], eax
    37.     mov [uProcess.dwSize], sizeof.PROCESSENTRY32
    38.    
    39.     invoke Process32First, [hSnapShot], uProcess
    40.     cmp eax, FALSE
    41.     je doExit
    42.     @@:
    43.         invoke Process32Next, [hSnapShot], uProcess
    44.         cmp eax, FALSE
    45.         je @F
    46.         invoke MessageBox, NULL, uProcess.szExeFile, sTitle, MB_OK
    47.         jmp @B
    48.     @@:
    49.     doExit:
    50.     invoke GetLastError
    51.     invoke FormatMessage, FORMAT_MESSAGE_FROM_SYSTEM, NULL, eax, NULL, sbError, 100, FORMAT_MESSAGE_ARGUMENT_ARRAY
    52.     invoke MessageBox, NULL, sbError, sTitle, MB_OK
    53.    
    54.     invoke CloseHandle, hSnapShot
    55.     invoke ExitProcess, NULL
    56.  
    57.  
    58. section '.idata' import data readable
    59.  
    60.     library kernel32, 'KERNEL32.DLL',\
    61.             user32, 'USER32.DLL',\
    62.             shell32, 'SHELL32.DLL'
    63.  
    64.     include '%fasminc%/apia/kernel32.inc'
    65.     include '%fasminc%/apia/user32.inc'