Как получить пути ко всем запущенным процессам в Windows XP на C++ Builder 6?
Требуется узнать пути ко всем запущенным процессам, чтоб можно было безошибочно определить запущенный *.exe файл, т.к. имена могут совпадать???
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{ // Показ процесс + путь
TCHAR _pach[300];
HANDLE _SnapProcess, _HProcess;
TProcessEntry32 _ProcessEntry;
DWORD _SizePath[300];
int _count = 0;
_id = 0;
_parID = 0;
Edit7->Text = "lsass.exe";
_h = 0;
ListView1->Clear();
_SnapProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
_ProcessEntry.dwSize = sizeof(TProcessEntry32);
if (Process32First(_SnapProcess, &_ProcessEntry))
{ while (Process32Next(_SnapProcess, &_ProcessEntry))
{ _count++;
TListItem *_TLI;
_HProcess = OpenProcess(PROCESS_ALL_ACCESS, true, _ProcessEntry.th32ProcessID);
GetModuleFileNameEx(_HProcess, 0, _pach, _SizePath[300]);
_TLI = ListView1->Items->Add();
_TLI->Caption = _count;
_TLI->SubItems->Add(_ProcessEntry.szExeFile); // имя .ехе файла
_TLI->SubItems->Add(_ProcessEntry.th32ProcessID ); // ИД процесса
_TLI->SubItems->Add(_ProcessEntry.th32ParentProcessID ); // ИД процесса родителя
_TLI->SubItems->Add(_pach);
if (Edit7->Text == _ProcessEntry.szExeFile)
{ _HProcess = OpenProcess(PROCESS_ALL_ACCESS, true, _ProcessEntry.th32ProcessID);
GetModuleFileNameEx(_HProcess, 0, _pach, _SizePath[_pach[300]]);
Edit5->Text = _pach ;
}
}
}
CloseHandle(_SnapProcess);
}
Правда, всё это требует доработки, но направление верное. Пока что прога не выдаёт некоторые пути, но победа уже близка. И в Edit5->Text ни чего не пишет, но это не принципиально..........
Странно как-то — копал 3 дня и не накопал ничего. По порядку:
- Функция для перечисления процессов — EnumProcesses
- Перечисление модулей, загруженных процессом (на всякий случай) — EnumProcessModules
- Получение имени модуля — GetModuleFileName
- Также можно не пользоваться этой байдой, а использовать PSAPI
P.S. Ах да, от нечего делать можно даже воспользоваться WTSEnumerateProcesses
P.P.S. И ещё, совсем забыл — ToolHelp
#include <vcl.h>
#pragma hdrstop
#include <psapi.h>
#include <fstream.h>
#include <tchar.h>
#pragma comment(lib,"D:/Program Files/Borland/CBuilder6/Lib/Psdk/psapi.lib")
#include "Unit1.h"
#include "ShellApi.h"
#include "Tlhelp32.hpp"
#include "Windows.hpp"
.........................................
//-------------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{ // Показ процесс + путь
TCHAR _pach [MAX_PATH];
HANDLE _SnapProcess, _HProcess;
TProcessEntry32 _ProcessEntry;
DWORD _SizePath;
_id = 0;
_parID = 0;
Edit7->Text = "lsass.exe";
_h = 0;
_SnapProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
_ProcessEntry.dwSize = sizeof(TProcessEntry32);
if (Process32First(_SnapProcess, &_ProcessEntry))
{ while (Process32Next(_SnapProcess, &_ProcessEntry))
{ if (Edit7->Text == _ProcessEntry.szExeFile)
{ _HProcess = OpenProcess(PROCESS_ALL_ACCESS, true, _ProcessEntry.th32ProcessID);
GetModuleFileNameEx(_HProcess, 0, _pach, _SizePath[_pach]);
Edit5->Text = _pach ;
}
}
}
}
//--------------------------------------------------------------------------------------------------
Выдаёт какие-то каракули в Edit5->Text типа ?@3fd$ , но ответ всегда один и тот же. Может TCHAR надо переводить как-то?
А какого типа свойство Text?
P.S. «Путь» по-английски path, если что ;)
procedure TForm1.Button1Click(Sender: TObject);
var
ProcessEntry: ProcessEntry32;
NextProcess: BOOL;
SnapProcess: CARDINAL;
Path: WIDECHAR;
begin
SnapProcess := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
ProcessEntry.dwSize := SizeOf(ProcessEntry);
NextProcess := Process32First(SnapProcess, ProcessEntry);
while NextProcess do
begin
if ProcessEntry.szExeFile = 'lsass.exe' then
begin
HProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcessEntry.th32ProcessID);
GetModuleFileNameEx(HProcess, 0, @Path, укажите размер чтоб принять всю строку);
if Path = 'ВАШ ПУТЬ К ЗЛОВРЕДНОМУ ВИРУСУ' then TerminateProcess(HProcess, тут почитайте нужно чё или 0 сойдёт);
CloseHandle(HProcess);
end;
NextProcess := Process32Next(SnapProcess, ProcessEntry);
end;
CloseHandle(SnapProcess);
end;
Перевёл и получилось то что я нашкорябал. Причём теперь выдаёт ошибку во время работы программы ""access violation at address 0040225E in module "ProcExp1.exe". Read of Address 0024F3EB."" Интересно почему прога ни чего не выдавала до этого, вроде б ни чего не менял.
C горем пополам решил сию задачу!!! Позже скину исходник, а то у меня грехопадение намечено, а женский пол обижать нельзя...
Цитата: Рэм
Text в buildere AnsiString а в Паскале видимо просто String, но в билдере есть как AnsiString так и String. В чём разница пока ещё не знаю
Вот это и надо выяснить в первую очередь, а также то, как формируются переменные этого типа (вдруг AnsiString — это указатель на объект строки со всякими полями; естественно, что в таком случае ты будешь получать псевдопостоянную фигню в текстовом поле)
Цитата: Рэм
GetModuleFileNameEx(HProcess, 0, @Path, …
А ведь я писал про адрес… Насколько я помню, в Delphi это означает взятие адреса, т.е. то же самое надо сделать в BCB. Дальше не смотрел, но наверняка ещё что-то да есть
Цитата: Рэм
Text в buildere AnsiString а в Паскале видимо просто String, но в билдере есть как AnsiString так и String. В чём разница пока ещё не знаю..
Если не знаешь что за тип и как он объявлен Ctrl+Click по нему.
Ну или в справке посмотреть