Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 11.06.2009, 08:34   #1
Maxxxtri23
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 17
По умолчанию Завершить процесс по пути

Как завершить процесс зная его путь(заметьте путь а не имя!)
Вот например у меня куча svchost.exe в диспетчере и один из них находится в C:\windows, так вот как именно его завершить?
И еще как можно отследить работает ли процесс, опятьже по директории и не имени.
Maxxxtri23 вне форума Ответить с цитированием
Старый 11.06.2009, 09:06   #2
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

Цитата:
Сообщение от Maxxxtri23 Посмотреть сообщение
Вот например у меня куча svchost.exe в диспетчере и один из них находится в C:\windows, так вот как именно его завершить?
Все svchost.exe находятся в папке C:\windows\System32 , это одна и та же программа.
rpy3uH вне форума Ответить с цитированием
Старый 11.06.2009, 13:10   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

а что из пути нельзя извлечь имя?
+получив привилегии отладчика можно получать полные пути.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.06.2009, 13:32   #4
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Предлагам свой вариант - сделать список : перечислить все процесс, дописать им ID, и дописать полные пути к файлам, которые процессы исполняют (в смысле к exe, в ntdll есть такие функции). Потом в списке найти нужные пути, взять обратно ID, открыть процесс и терминировать. Все.
BaronTreep вне форума Ответить с цитированием
Старый 11.06.2009, 14:23   #5
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию Получение полного пути по PID

Следующий код получает полный путь к процессу по PID
Код:
type
  NTStatus = cardinal;

  PUnicodeString = ^TUnicodeString;
  TUnicodeString = packed record
   Length: Word;
   MaximumLength: Word;
   Buffer: PWideChar;
  end;

  PPROCESS_BASIC_INFORMATION = ^_PROCESS_BASIC_INFORMATION;
  _PROCESS_BASIC_INFORMATION = packed record
   ExitStatus: BOOL;
   PebBaseAddress: pointer;
   AffinityMask: PULONG;
   BasePriority: dword;
   UniqueProcessId: ULONG;
   InheritedFromUniqueProcessId: ULONG;
  end;

const
  ProcessBasicInformation = 0;
  STATUS_SUCCESS              = NTStatus($00000000);

Function ZwQueryInformationProcess(ProcessHandle:THandle; ProcessInformationClass:DWORD;ProcessInformation:pointer;
 ProcessInformationLength:ULONG; ReturnLength: PULONG):NTStatus;stdcall; external 'ntdll.dll';

function GetNameByPid(Pid: dword): string;
var
 hProcess, Bytes: dword;
 Info: _PROCESS_BASIC_INFORMATION;
 ProcessParametres: pointer;
 ImagePath: TUnicodeString;
 ImgPath: array[0..MAX_PATH] of WideChar;
begin
 Result := '';
 ZeroMemory(@ImgPath, MAX_PATH * SizeOf(WideChar));
 hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, Pid);
 if ZwQueryInformationProcess(hProcess, ProcessBasicInformation, @Info,
                              SizeOf(_PROCESS_BASIC_INFORMATION), nil) = STATUS_SUCCESS then
  begin
   if ReadProcessMemory(hProcess, pointer(dword(Info.PebBaseAddress) + $10),
                        @ProcessParametres, SizeOf(pointer), Bytes) and
      ReadProcessMemory(hProcess, pointer(dword(ProcessParametres) + $38),
                        @ImagePath, SizeOf(TUnicodeString), Bytes)  and
      ReadProcessMemory(hProcess, ImagePath.Buffer, @ImgPath,
                        ImagePath.Length, Bytes) then
        begin
          Result := WideCharToString(ImgPath);
        end;
   end;
 CloseHandle(hProcess);
end;
всё остальное как сказал BaronTreep
rpy3uH вне форума Ответить с цитированием
Старый 11.06.2009, 15:33   #6
Maxxxtri23
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 17
По умолчанию

Цитата:
Сообщение от BaronTreep Посмотреть сообщение
Предлагам свой вариант - сделать список : перечислить все процесс, дописать им ID, и дописать полные пути к файлам, которые процессы исполняют (в смысле к exe, в ntdll есть такие функции). Потом в списке найти нужные пути, взять обратно ID, открыть процесс и терминировать. Все.
Если не затруднит, можно пример, а то я в API не шарю =(
Maxxxtri23 вне форума Ответить с цитированием
Старый 11.06.2009, 16:02   #7
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Цитата:
Если не затруднит, можно пример, а то я в API не шарю =(
Хм. Я кажется обладаю волшебными исходниками. В них даже есть функция, приведенная выше. Достал их с wasm'a. Там достаточно много, поэтому нужно разбиратся:

http://wasm.ru/article.php?article=hiddndt
http://wasm.ru/pub/21/files/phunter.rar

Последний раз редактировалось BaronTreep; 11.06.2009 в 16:04.
BaronTreep вне форума Ответить с цитированием
Старый 11.06.2009, 19:03   #8
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

Цитата:
Сообщение от Maxxxtri23 Посмотреть сообщение
Если не затруднит, можно пример, а то я в API не шарю =(
ааа вот в чём проблема...
ну тогда надо разобраться в основах и потом переходить к задачам такого типа
rpy3uH вне форума Ответить с цитированием
Старый 12.06.2009, 14:15   #9
Maxxxtri23
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 17
По умолчанию

Всем спс, но задачу решил намного проще, вот мож кому надо:
1)Убить процесс по пути
Код:
procedure TaskKill(FileName: string);
var
  wh: Bool;
  sp, sm, th: THandle;
  pe: TProcessEntry32;
  me: TModuleEntry32;
  seid: Int64;
  tp: TOKEN_PRIVILEGES;
  rl: Cardinal;
begin
  //получаем debug-привелегию
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY, th);
  LookupPrivilegeValue(nil, 'SeDebugPrivilege', seid);
  with tp do
  begin
    PrivilegeCount:= 1;
    Privileges[0].Luid := seid;
    Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  end;
  AdjustTokenPrivileges(th, False, tp, SizeOf(tp), tp, rl);

  //создаем снапшот
  sp := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  pe.dwSize := SizeOf(pe);
  wh := Process32First(sp, pe);
  //пробегаемся циклом по всем процессам и убиваем FileName при совпадении
  while wh <> False do
  begin
    sm := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe.th32ProcessID);
    me.dwSize := SizeOf(me);
    Module32First(sm, me);
    if LowerCase(me.szExePath) = LowerCase(FileName) then
      TerminateProcess(OpenProcess($0001, False, pe.th32ProcessID), 0);
    CloseHandle(sm);
    wh := Process32Next(sp, pe);
  end;
  CloseHandle(sp);
  tp.Privileges[0].Attributes := 0;
  AdjustTokenPrivileges(th, False, tp, SizeOf(tp), tp, rl);
end;
2) Отследить работает ли процесс по пути:
Код:
procedure Tasksearch(FileName: string);
var
  wh: Bool;
  sp, sm, th: THandle;
  pe: TProcessEntry32;
  me: TModuleEntry32;
  seid: Int64;
  tp: TOKEN_PRIVILEGES;
  rl: Cardinal;
  run:string
begin
  //ïîëó÷àåì debug-ïðèâåëåãèþ
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY, th);
  LookupPrivilegeValue(nil, 'SeDebugPrivilege', seid);
  with tp do
  begin
    PrivilegeCount:= 1;
    Privileges[0].Luid := seid;
    Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  end;
  AdjustTokenPrivileges(th, False, tp, SizeOf(tp), tp, rl);

  //ñîçäàåì ñíàïøîò
  sp := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  pe.dwSize := SizeOf(pe);
  wh := Process32First(sp, pe);
  //ïðîáåãàåìñÿ öèêëîì ïî âñåì ïðîöåññàì è óáèâàåì FileName ïðè ñîâïàäåíèè
  while wh <> False do
  begin
    sm := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe.th32ProcessID);
    me.dwSize := SizeOf(me);
    Module32First(sm, me);
    run:='Îñòàíîâëåí';
    if LowerCase(me.szExePath) = LowerCase(FileName) then
      run:='Çàïóùåí';
    CloseHandle(sm);
    wh := Process32Next(sp, pe);
  end;
  CloseHandle(sp);
  tp.Privileges[0].Attributes := 0;
  AdjustTokenPrivileges(th, False, tp, SizeOf(tp), tp, rl);
end;
Тему можно close
Maxxxtri23 вне форума Ответить с цитированием
Старый 13.06.2009, 15:50   #10
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Функции

CreateToolhelp32Snapshot
Module32First
Process32First
Process32Next

похожи на функции поиска файлов. Впервые их вижу. Интересная штука - поиск в процессах, как в файлах.

А в каком модуле они описаны???
BaronTreep вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как завершить процесс на удаленном Хосте? Stilet Win Api 4 25.03.2009 14:06
Завершить процесс Roman®© Общие вопросы Delphi 5 01.02.2009 16:53
с помощью Delphi завершить процесс Explorer.exe Phantom_nvkz Win Api 1 25.01.2009 17:45
Завершить процесс doniyor Win Api 2 15.05.2008 21:52
снова завершить процесс WOLFak Win Api 10 22.01.2008 19:07