Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Получение списка процессов и их завершение 
:(
    Опции темы
Rupor
Дата 19.7.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 4.7.2009

Репутация: нет
Всего: нет



Допустим есть файл такого вида:
C:\program1.exe
C:\program2.exe
C:\program3.exe

Это файл с путями до программ, которые запрещено запускать. Как прочитать этот файл средствами апи, затем получить список процессов и если процесс есть в списке запрещенных - завершить его? 

И как отследить запуск нового приложения? И затем составить файл вида:
Путь до приложения Время запуска
Заранее благодарен.


Это сообщение отредактировал(а) Rupor - 19.7.2009, 13:36
PM MAIL   Вверх
Данкинг
Дата 19.7.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Код

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,Psapi, tlhelp32;
.....

procedure CreateWin9xProcessList(List: TstringList);
var
  hSnapShot: THandle;
  ProcInfo: TProcessEntry32;
begin
  if List = nil then
    Exit;
  hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapShot <> THandle(-1)) then
  begin
    ProcInfo.dwSize := SizeOf(ProcInfo);
    if (Process32First(hSnapshot, ProcInfo)) then
    begin
      List.Add(ProcInfo.szExeFile);
      while (Process32Next(hSnapShot, ProcInfo)) do
        List.Add(ProcInfo.szExeFile);
    end;
    CloseHandle(hSnapShot);
  end;
end;

procedure CreateWinNTProcessList(List: TstringList);
var
  PIDArray: array[0..1023] of DWORD;
  cb: DWORD;
  I: Integer;
  ProcCount: Integer;
  hMod: HMODULE;
  hProcess: THandle;
  ModuleName: array[0..300] of Char;
begin
  if List = nil then
    Exit;
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
  ProcCount := cb div SizeOf(DWORD);
  for I := 0 to ProcCount - 1 do
  begin
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
      PROCESS_VM_READ,
      False,
      PIDArray[I]);
    if (hProcess <> 0) then
    begin
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
      List.Add(ModuleName);
      CloseHandle(hProcess);
    end;
  end;
end;

procedure GetProcessList(var List: TstringList);
var
  ovi: TOSVersionInfo;
begin
  if List = nil then
    Exit;
  ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(ovi);
  case ovi.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(List);
    VER_PLATFORM_WIN32_NT: CreateWinNTProcessList(List);
  end
end;

function KillTask(ExeFileName: string): integer;///ФУНКЦИЯ УБИВАНИЯ ПРОЦЕССА
const
  PROCESS_TERMINATE=$0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := 0;

  FSnapshotHandle := CreateToolhelp32Snapshot
  (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
  FProcessEntry32);

  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
    UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
    UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(OpenProcess(
      PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;

  CloseHandle(FSnapshotHandle);
end;

   
procedure fill;///ПОЛУЧАЕМ СПИСОК ПРОЦЕССОВ В ListBox1 (ЕСЛИ НУЖНО)
var
  i,MaxWidth: Integer;
  MyProcList: TstringList;
begin
  MyProcList := TStringList.Create;
  try
    GetProcessList(MyProcList);
    if MyProcList = nil then
      Exit;
    for i := 0 to MyProcList.Count - 1 do
      if pos('.EXE',uppercase(MyProcList.Strings[i]))<>0 then ListBox1.Items.Add(MyProcList.Strings[i]);
  finally
    MyProcList.Free;
  end;
 MaxWidth := 0;
  for i := 0 to ListBox1.Items.Count - 1 do
    if MaxWidth < ListBox1.Canvas.TextWidth(ListBox1.Items.Strings[i]) then
      MaxWidth := ListBox1.Canvas.TextWidth(ListBox1.Items.Strings[i]);
  SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, MaxWidth+2, 0);

end;


Использование:
Код

KillTask('c:\aaa.exe');


Это сообщение отредактировал(а) Данкинг - 19.7.2009, 13:39


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Riply
Дата 20.7.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Данкинг, чуть попривиредничаю, но по-мелочи smile

Цитата(Данкинг @  19.7.2009,  13:38 Найти цитируемый пост)
if (hSnapShot <> THandle(-1)) then

В общем случае, THandle(-1) <> INVALID_HANDLE_VALUE 

Цитата(Данкинг @  19.7.2009,  13:38 Найти цитируемый пост)
ModuleName: array[0..300] of Char;

Не пробовала, но не исключен вариант, что можно создать процесс,
путь к исполняемому файлу которого превысит 300
Кстати, не понятно откуда данная цифра. Почему не MAX_PATH ?

Цитата(Данкинг @  19.7.2009,  13:38 Найти цитируемый пост)
 if (hProcess <> 0) then
    begin

Отнудь не факт, что последующие операции пройдут без исключений.
Нужен try/finally
Плюс к этому отсутствует проверка результатов вызываемых ф-ий.
(EnumProcessModules, GetModuleFilenameEx) - откуда у нас уверенность, что они правильно отработали
и мы возвращаем корректную информацию ?

Цитата(Данкинг @  19.7.2009,  13:38 Найти цитируемый пост)
GetVersionEx(ovi);

Опять нет проверки результата. 
Чтобы не зафлуживать форум, я не буду больше писать о таких мелочах smile

Цитата(Данкинг @  19.7.2009,  13:38 Найти цитируемый пост)
TerminateProcess(OpenProcess(
      PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));

Утечка Handle`ов. 
Она может оказаться и пострашнее, чем утечка памяти.

P.S.
 Это беглый просмотр. Возможно, что при детальном всплывут еще недочеты.
P.P.S.
Цитата(Данкинг @  19.7.2009,  13:38 Найти цитируемый пост)
KillTask('c:\aaa.exe');

А если таких процессов 38 ? smile

Это сообщение отредактировал(а) Riply - 20.7.2009, 12:12
PM MAIL   Вверх
niteo
Дата 20.7.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 23.11.2006
Где: Брянск

Репутация: нет
Всего: 1



Код

procedure PrintProcessNameAndID( processID: Cardinal );
const
  ROCESS_QUERY_INFORMATION = $0400;
  PROCESS_VM_READ          = $0010;
var
  szProcessName : array[0..MAX_PATH] of Char;
  hProcess : THandle;
  hMod : HMODULE;
  cbNeeded : Cardinal;
begin
  hProcess := OpenProcess(ROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, processID);
  if (hProcess <> 0) then
  begin
    if EnumProcessModules(hProcess, @hMod, sizeof(hMod), cbNeeded) then
    begin
      GetModuleBaseName(hProcess, hMod, szProcessName, MAX_PATH);
    end;
  end;
  Form1.Memo1.Lines.Add(Format('%s (PID: %d)', [szProcessName, processID]));
  CloseHandle(hProcess);
end;

procedure GetAllProcessesInfo;
var
  aProcesses : array[0..$FFF] of Cardinal;
  cbNeeded   : Cardinal;
  cProcesses : Cardinal;
  i : Cardinal;
begin
  if not EnumProcesses(@aProcesses, sizeof(aProcesses), cbNeeded) then Exit;
  cProcesses := round(cbNeeded / 4);
  for i := 0 to cProcesses do
    if  aProcesses[i] <> 0 then
      PrintProcessNameAndID( aProcesses[i] );
end;

function TerminateTask(PID:integer):integer;
var
  process_handle : integer;
  lpExitCode : Cardinal;
begin
  process_handle:=openprocess(PROCESS_ALL_ACCESS, True, PID);
  GetExitCodeProcess(process_handle, lpExitCode);

  if (process_handle = 0) then
     TerminateTask := GetLastError
  else
  if terminateprocess(process_handle, lpExitCode) then
  begin
    TerminateTask := 0;
    CloseHandle(process_handle);
  end
  else
  begin
    TerminateTask := GetLastError;
    CloseHandle(process_handle);
  end;

end;



Убивать правда сможешь только не сервисы.
Всю эту задачу по запуску программ можно решить средствами Виндоуз. smile 
--------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй...
PM MAIL   Вверх
Rrader
  Дата 20.7.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191




 ! 
Rrader
Rupor, слишком много вопросов в топе! Ознакомьтесь с правилами форума!



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.