Сейчас на форуме: tyns777, zds, JustLife, 2nd, morgot, Rio (+5 невидимых)

 eXeL@B —› Программирование —› Убить процесс полностью...
Посл.ответ Сообщение


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 25 июля 2009 10:14
· Личное сообщение · #1

Собственно никогда не сталкивался с данной потребностью, но ...
Написал вот такое...
Code:
  1.                         invoke         CreateToolhelp32Snapshot, 2, 0
  2.                         mov hSnapshot, eax
  3.                         mov uProcess.dwSize, sizeof uProcess
  4.                         invoke Process32First, hSnapshot, addr uProcess
  5.                         mov hProcess, eax
  6.                  @@:    invoke Process32Next, hSnapshot, addr uProcess
  7.                         mov hProcess, eax
  8.                         mov ecx,12
  9.                         lea esi,chr$("explorer.exe")
  10.                         lea edi,uProcess.szExeFile                  
  11.                         repe cmpsb
  12.                         jne @B
  13.                         invoke OpenProcess,PROCESS_ALL_ACCESS, 1, uProcess.th32ProcessID
  14.                         invoke TerminateProcess, eax, 0
  15.                         invoke CloseHandle,hSnapshot
  16.  


Данный код гасит експлорер, но эта сволочь через несколько секунд запускается опять...
В общем мне нужен программный аналог командной строки - taskkill /f /im explorer.exe
Только естественно без привлечения ShellExecute...
Подскажите пожалста....

-----
aLL rIGHTS rEVERSED!





Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 25 июля 2009 10:23
· Личное сообщение · #2

ну дык и используй taskkill /f /im explorer.exe в чем проблема то? Можно через WinExec или CreateProcess. Экслорер перезапускает система, поэтому наверняка гдето в реестре есть параметр перезапускать его в случае чего, погугли на эту тему

-----
Лень - это подсознательная мудрость




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 25 июля 2009 10:36
· Личное сообщение · #3

Code:
  1. invoke TerminateProcess, eax, STATUS_WAIT_1

Винлогон проверяет код завершения процесса(PROCESS_BASIC_INFORMATION.ExitStatus) и если он отличен от STATUS_WAIT_1 считает что произошёл сбой, добавляет запись в логи и перезапускает проводник.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 25 июля 2009 10:58
· Личное сообщение · #4

Code:
  1. NTSTATUS
  2.   ZwOpenProcess (
  3.     __out PHANDLE  ProcessHandle,
  4.     __in ACCESS_MASK  DesiredAccess,
  5.     __in POBJECT_ATTRIBUTES  ObjectAttributes,
  6.     __in_opt PCLIENT_ID  ClientId
  7.     );
  8.          
  9. NTSTATUS
  10.   ZwTerminateProcess(
  11.     IN HANDLE  ProcessHandle,
  12.     IN NTSTATUS  ExitStatus
  13.     );
  14.          
  15. VOID TerminateExplorer(HANDLE dwPID);
  16.  
  17.  
  18. VOID TerminateExplorer(HANDLE dwPID)
  19. {
  20.          HANDLE hProcess;
  21.          OBJECT_ATTRIBUTES lpObjectAttr;
  22.          CLIENT_ID lpCid;
  23.          NTSTATUS ntStatus;
  24.  
  25.          InitializeObjectAttributes(&lpObjectAttr, NULL, 0, NULL, NULL);
  26.  
  27.          lpCid.UniqueProcess = dwPID;
  28.          lpCid.UniqueThread = 0;
  29.  
  30.          ntStatus = ZwOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &lpObjectAttr, &lpCid);
  31.          if (ntStatus)
  32.          {
  33.                  ZwTerminateProcess(hProcess, STATUS_WAIT_1);
  34.                  return;
  35.          }
  36.  
  37.          return;
  38. }


Должен работать ;)

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 25 июля 2009 11:37
· Личное сообщение · #5

Всем спасибо Проблема решена..

-----
aLL rIGHTS rEVERSED!



 eXeL@B —› Программирование —› Убить процесс полностью...
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати