Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получение списка запущенных процессов


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, но видимо
> руки не от тудова растут :-(.

Покажи исходник. Как пробовал?


Наверх

Титульная страница Поиск, карта сайта Написать письмо