Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как получить пути ко всем запущенным процессам в Windows XP на C++ Builder 6?

84K
14 ноября 2012 года
Рэм
10 / / 13.11.2012
Требуется узнать пути ко всем запущенным процессам, чтоб можно было безошибочно определить запущенный *.exe файл, т.к. имена могут совпадать???
84K
15 ноября 2012 года
Рэм
10 / / 13.11.2012
В-общем получилась вот такая рабочая байда
//---------------------------------------------------------------------------

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 ни чего не пишет, но это не принципиально..........
7
14 ноября 2012 года
@pixo $oft
3.4K / / 20.09.2006
Чего-то ты темы дублируешь. Решил ответить здесь, а ту снеси

Странно как-то — копал 3 дня и не накопал ничего. По порядку:
  • Функция для перечисления процессов — EnumProcesses
  • Перечисление модулей, загруженных процессом (на всякий случай) — EnumProcessModules
  • Получение имени модуля — GetModuleFileName
  • Также можно не пользоваться этой байдой, а использовать PSAPI
Вот как-то так. Будут вопросы — обращайся

P.S. Ах да, от нечего делать можно даже воспользоваться WTSEnumerateProcesses
P.P.S. И ещё, совсем забыл — ToolHelp
84K
14 ноября 2012 года
Рэм
10 / / 13.11.2012
Мулевал пакую ерунду:

#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 надо переводить как-то?
7
14 ноября 2012 года
@pixo $oft
3.4K / / 20.09.2006
Не знаю, с Builder'овскими типами не знаком. И да, в GetModuleFileNameEx надо всё же ссылку на буфер передавать. В Process32Next по ссылке ж структуру передавал ☺
А какого типа свойство Text?

P.S. «Путь» по-английски path, если что ;)
84K
14 ноября 2012 года
Рэм
10 / / 13.11.2012
Text в buildere AnsiString а в Паскале видимо просто String, но в билдере есть как AnsiString так и String. В чём разница пока ещё не знаю. _pach это просто переменная её можно назвать как угодно, просто это я пытался перевести пример с паскаля на с++ и чтоб не запутаться имена оставил как в предложенном примере.
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."" Интересно почему прога ни чего не выдавала до этого, вроде б ни чего не менял.
84K
14 ноября 2012 года
Рэм
10 / / 13.11.2012
C горем пополам решил сию задачу!!! Позже скину исходник, а то у меня грехопадение намечено, а женский пол обижать нельзя...
7
14 ноября 2012 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Рэм
Text в buildere AnsiString а в Паскале видимо просто String, но в билдере есть как AnsiString так и String. В чём разница пока ещё не знаю

Вот это и надо выяснить в первую очередь, а также то, как формируются переменные этого типа (вдруг AnsiString — это указатель на объект строки со всякими полями; естественно, что в таком случае ты будешь получать псевдопостоянную фигню в текстовом поле)

Цитата: Рэм
GetModuleFileNameEx(HProcess, 0, @Path, …

А ведь я писал про адрес… Насколько я помню, в Delphi это означает взятие адреса, т.е. то же самое надо сделать в BCB. Дальше не смотрел, но наверняка ещё что-то да есть

277
14 ноября 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Рэм
Text в buildere AnsiString а в Паскале видимо просто String, но в билдере есть как AnsiString так и String. В чём разница пока ещё не знаю..


Если не знаешь что за тип и как он объявлен Ctrl+Click по нему.
Ну или в справке посмотреть

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог