Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.039 c
1-1119622960
Игорь Степанов
2005-06-24 18:22
2005.07.18
Зависимость между обычными пикселами канвы и логическими пикселам


14-1119504097
koderman
2005-06-23 09:21
2005.07.18
Изучая Delphi


9-1112638214
JockerColl
2005-04-04 22:10
2005.07.18
Физика "прыжка"


14-1119507902
ntman
2005-06-23 10:25
2005.07.18
Закачка файла


3-1117702051
ryds
2005-06-02 12:47
2005.07.18
синтаксис Lookup и/или Locate по двум полям





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский