Текущий архив: 2005.07.18;
Скачать: CL | DM;
ВнизПолучение списка запущенных процессов Найти похожие ветки
← →
gdaujk © (2005-05-21 07:33) [0]Надо получить список запуценных процессов (как в Диспетчере задач), и узнать имя и расположение на диске модуля (Exe, Dll...) с которым связан каждый из этих процессов (типа GetModuleFileName). Нужно получить именно реальное расположение на диске. Пробовал функции из Toolhelp32 и PsAPI, но видимо руки не от тудова растут :-(.
← →
Kerk © (2005-05-21 10:55) [1]
> Пробовал функции из Toolhelp32 и PsAPI, но видимо
> руки не от тудова растут :-(.
Покажи исходник. Как пробовал?
← →
Eraser © (2005-05-21 11:33) [2]gdaujk © (21.05.05 07:33)
Хоть бы на 10 записей вниз глянул...
http://delphimaster.net/view/4-1116486705/
← →
gdaujk © (2005-05-21 12:15) [3]Пробовал:
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, там тоже чего-то не выходило, того кода вроде не осталось. Щас может занова напишу и сюды скину.
← →
Плохиш © (2005-05-21 12:23) [4]Там есть ешё Modules32..
← →
Eraser © (2005-05-21 12:29) [5]gdaujk © (21.05.05 07:33)
Под 9x -- Toolhelp32
Под NT -- GetModuleFileNameEx
← →
gdaujk © (2005-05-21 13:58) [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 14:00) [7]А они точно будут пахать под 9x ?
Точно!
← →
gdaujk © (2005-05-21 14:07) [8]Кстати, Process32 выдаёт хенделы и, соответственно, краткие имена ВСЕХ процессов. Вот только имна краткие, без пути...
← →
Eraser © (2005-05-21 14:22) [9]gdaujk © (21.05.05 14:07) [8]
Кстати, Process32 выдаёт хенделы
Я ж написал
GetModuleFileNameEx!
← →
Medved © (2005-05-21 18:14) [10]2 gdaujk © (21.05.05 13:58) [6]
да вот не хватает по сравнению с Диспетчером в получившемся списке 5-пяти процессов
С помощью AdjustTokenPrivileges() установи SeDebugPrivilege.
И вообще это есть на http://delphimaster.net/view/4-1116486705/ под номером Medved © (15.05.05 17:21) [15]
← →
gdaujk © (2005-05-22 01:04) [11]>>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;
Большое спасибо всем участвовавшим в обсуждении.
Страницы: 1 вся ветка
Текущий архив: 2005.07.18;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.035 c