Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.045 c
14-1119470222
NewWonder
2005-06-22 23:57
2005.07.18
Сколько стоит написать курсовик?


3-1118161850
Alex Romanskiy
2005-06-07 20:30
2005.07.18
Как в InterBase получить текущее значение генератора?


1-1120384016
aapp
2005-07-03 13:46
2005.07.18
Использование *.h


14-1119873163
_Anton
2005-06-27 15:52
2005.07.18
Динамичаски добавить поле


14-1119771886
boriskb
2005-06-26 11:44
2005.07.18
Опять юмор. Скучно.