• XSS.stack #1 – первый литературный журнал от юзеров форума

Отслеживаем завершение нужного процесса

demien

(L2) cache
Пользователь
Регистрация
29.09.2008
Сообщения
492
Реакции
14
В интернетах есть сниппет на дельфях, показывающий как убить процесс с помощью функций из TlHelp32 и юзая апишку OpenProcess с флагом PROCESS_TERMINATE=$0001; (Именуется он KillTask, гуглите)

Также интернетах есть много кодеса для того чтобы отсделить запущенный тобой процесс (т.е. порадить его и потом отследить конец работы - гугли WinExecAndWait и тому подобное).
А что делать в случае, если процесс запущен не тобой?
Так вот я переписал буквально строчку кода для обнаружения запущен ли процесс или нет.

сам кодес...

Код:
function CheckProcessByExeName(ExeFileName: string): integer;
const PROCESS_QUERY_INFORMATION=$0400;
var ContinueLoop    : BOOL;
    FSnapshotHandle : THandle;
    FProcessEntry32 : TProcessEntry32;
    hProcess        : Cardinal;
begin
  result := 0;
  FSnapshotHandle        := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop       := Process32First(FSnapshotHandle, FProcessEntry32);
  ExeFileName            := UpperCase(ExeFileName);
  while integer(ContinueLoop) <> 0 do
  begin
    if ( (UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = ExeFileName) or
         (UpperCase(FProcessEntry32.szExeFile) = ExeFileName)
       ) then
    begin
      hProcess := OpenProcess( PROCESS_QUERY_INFORMATION, BOOL(0), FProcessEntry32.th32ProcessID);
      Result   := hProcess;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

юзаем так:
Код:
while CheckProcessByExeName('calc.exe') <> 0 do begin
  // let's sleep 200 mls
  Sleep(200);
end;
ShowMessage('Proc was done')
 
А есть же lstrcmpiA - это чтобы не ебаться со всяким UpperCase. Ну и избавляемся от string ибо нахуй - PathStripPath вместо ExtractFileName, да и вообще, результат FProcessEntry32.szExeFile - всегда имя exe, да и нахуй TlHelp32, т.к лишней х#йни в наш бинарь сует.

Так:
Код:
type
TProcessEntry32 = packed record
dwSize: DWORD;
cntUsage: DWORD;
th32ProcessID: DWORD;
th32DefaultHeapID: DWORD;
th32ModuleID: DWORD;
cntThreads: DWORD;
th32ParentProcessID: DWORD;
pcPriClassBase: Longint;
dwFlags: DWORD;
szExeFile: array[0..MAX_PATH-1] of Char;
end;

const
TH32CS_SNAPPROCESS = $00000002;
PROCESS_QUERY_INFORMATION = $0400;

function CreateToolhelp32Snapshot(dwFlags,th32ProcessID:DWORD):THandle;stdcall;external 'kernel32.dll';
function Process32First(hSnapshot:THandle;var lppe:TProcessEntry32):BOOL;stdcall;external 'kernel32.dll';
function Process32Next(hSnapshot:THandle;var lppe:TProcessEntry32):BOOL;stdcall;external 'kernel32.dll';

function CheckProcessByExeName(ExeFileName:pchar):integer;
var
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result:=0;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
if Process32First(FSnapshotHandle,FProcessEntry32) then
begin
        repeat
                if lstrcmpiA(FProcessEntry32.szExeFile,ExeFileName)=0 then
                begin
                result:=OpenProcess(PROCESS_QUERY_INFORMATION,False,FProcessEntry32.th32ProcessID);
                break;
                end;
        until not Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

А еще может быть несколько процессов с одинаковыми именами.
 
Тоже верно. Но мне оптимизация особо пох, ибо не критично, а так да, так тоже можно:)
Я верю, что есть еще множество вариантов сделать это, и даже более кошерных, если покопаться.
 
Код:
void KP(char *name)
{
	int x=0;
	PROCESSENTRY32 PE32;
	HANDLE temp = NULL;
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	if(hSnapshot != INVALID_HANDLE_VALUE)
	{
  PE32.dwSize = sizeof(PROCESSENTRY32);
  if(Process32First(hSnapshot, &PE32))
  {
  	do {
    if(lstrcmpA(PE32.szExeFile, name)==NULL)
    {
    	temp =OpenProcess(PROCESS_TERMINATE, false, PE32.th32ProcessID);
    	if(temp)
    	{
      TerminateProcess(temp,DWORD(-1));
      CloseHandle(temp);
    	}
    }
  	}
  	while(xProcess32Next(hSnapshot, &PE32));
  }
	}
	CloseHandle(hSnapshot);
}

Ловите ребьятка -) на Си
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх