![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение списка запущенных процессов
gdaujk © (2005-05-21 07:33:00)Надо получить список запуценных процессов (как в Диспетчере задач), и узнать имя и расположение на диске модуля (Exe, Dll...) с которым связан каждый из этих процессов (типа GetModuleFileName). Нужно получить именно реальное расположение на диске. Пробовал функции из Toolhelp32 и PsAPI, но видимо руки не от тудова растут :-(.
gdaujk (2005-05-22 01:04:00) [1]>>Medved © (21.05.05 18:14) [10]
Ты прав. Привожу конечный код для XP:
var
ID: array[0..$FF - 1] of DWORD;
Count, C, TokenH: Cardinal;
Luid: TLargeInteger;
TokenPriv: TOKEN_PRIVILEGES;
i: Integer;
ProcH: THandle;
ModH: array [ 0 .. $FF ] of HMODULE;
ModName: array [0..MAX_PATH] of Char;
pItem: tagLVITEMA;
ReturnLen: DWORD;
begin
EnumProcesses(@ID, SizeOf(ID), Count);
PItem.mask := LVIF_TEXT;
PItem.iItem := 0;
//смена привилегий
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, TokenH) then
if LookupPrivilegeValue(nil, 'SeDebugPrivilege', Luid) then
begin
with TokenPriv do
begin
PrivilegeCount := 1;
Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Privileges[0].Luid := luid;
end;
AdjustTokenPrivileges(TokenH, false, TokenPriv, 0, nil,
ReturnLen);
end;
for i := 0 to (Count div SizeOf(DWORD)) - 1 do
begin
ProcH := OpenProcess(PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ, False, ID[i]);
if ProcH <> 0 then
begin
EnumProcessModules(ProcH, @ModH, SizeOf(ModH), C);
if GetModuleFileNameEx(ProcH, ModH[0], ModName,
SizeOf(ModName)) > 0
then
SendMessage(List3, LB_ADDSTRING, 0, LPARAM(@ModName));
end;
CloseHandle(ProcH);
end;
end;
Большое спасибо всем участвовавшим в обсуждении.
Medved (2005-05-21 18:14:00) [2]2 gdaujk © (21.05.05 13:58) [6]
да вот не хватает по сравнению с Диспетчером в получившемся списке 5-пяти процессов
С помощью AdjustTokenPrivileges()установи SeDebugPrivilege.
И вообще это есть на http://www.delphimaster.ru/cgi-bin/forum.pl?id=1116090982&n=5под номером Medved © (15.05.05 17:21) [15]
Eraser (2005-05-21 14:22:00) [3]gdaujk © (21.05.05 14:07) [8]
Кстати, Process32 выдаёт хенделы
Я ж написал
GetModuleFileNameEx!
gdaujk (2005-05-21 14:07:00) [4]Кстати, Process32 выдаёт хенделы и, соответственно, краткие имена ВСЕХ процессов. Вот только имна краткие, без пути...
Eraser (2005-05-21 14:00:00) [5]А они точно будут пахать под 9x ?
Точно!
gdaujk (2005-05-21 13:58:00) [6]>>Eraser © (21.05.05 12:29) [5]
Так то да, я попробовал с PsAPI (GetModuleFileNameEx) сл. образом:
EnumProcesses(@BA, SizeOf(BA), Count);
SetLength(ID, Count div SizeOf(DWORD));
Move(BA, ID[0], Count);
for i := 0 to (Count div SizeOf(DWORD)) - 1 do
begin
ProcH := OpenProcess(PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ,
False, ID[i]);
if ProcH <> 0 then
begin
EnumProcessModules(ProcH, @ModH, 1, C);
if GetModuleFileNameEx(ProcH, ModH,ModName,SizeOf(ModName))
> 0
then
SendMessage(List3, LB_ADDSTRING, 0, LPARAM(@ModName[0]));
end;
CloseHandle(ProcH);
end;
Все на первый взгляд работает, да вот не хватает по сравнению с Диспетчером в получившемся списке 5-пяти процессов. Ну "бездействие системы" нету - это понятно. Но вот для процессов: CSRSS.EXE, SVCHOST.EXE - OpenProcess выдаёт 0, хотя их идентификаторы ID в диспетчере есть. А ещё один идентификатор, присутствующий у меня в ID[] в аналогичном списке Диспетчера отсутствует :-( Поможите, люди добрые.
PS: Modules32 в XP, точно, как и Process32, не прокатывает. А они точно будут пахать под 9x ?
Eraser (2005-05-21 12:29:00) [7]gdaujk © (21.05.05 07:33)
Под 9x -- Toolhelp32
Под NT -- GetModuleFileNameEx
Плохиш (2005-05-21 12:23:00) [8]Там есть ешё Modules32..
gdaujk (2005-05-21 12:15:00) [9]Пробовал:
Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, dword(0));
if Snap <> -1
then
begin
SendMessage(List3, LB_RESETCONTENT, 0, 0);
PE.dwSize := SizeOf(TProcessEntry32);
if Process32First(Snap, PE)
then
repeat
SendMessage(List3,LB_ADDSTRING,0,LPARAM(@PE.szExeFile));
until not Process32Next(Snap, PE);
end;
CloseHandle(Snap);
Но PE.szExeFile - только имя файла процесса, а путь а пути к нему (типа С:\...\Имя.Exe) нет. Помнится, пробовал то же с Module32, но и результат тот же. Кстати, пишу под XP, если это имеет значение, но охото, что бы и под 9X работало.
Пробовал и с PsAPI, там тоже чего-то не выходило, того кода вроде не осталось. Щас может занова напишу и сюды скину.
Eraser (2005-05-21 11:33:00) [10]gdaujk © (21.05.05 07:33)
Хоть бы на 10 записей вниз глянул...
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1116486705&n=5
Kerk (2005-05-21 10:55:00) [11]
> Пробовал функции из Toolhelp32 и PsAPI, но видимо
> руки не от тудова растут :-(.
Покажи исходник. Как пробовал?