Главная страница
    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.04 c
14-1119676905
Бухало)))
2005-06-25 09:21
2005.07.18
Алкоголь


14-1119363167
Игорь Шевченко
2005-06-21 18:12
2005.07.18
Ищутся компоненты для работы с протоколом SMPP


1-1119788329
начинающий
2005-06-26 16:18
2005.07.18
Как определить, пуста ли определенная папка?


14-1119850846
Ega23
2005-06-27 09:40
2005.07.18
С днем рождения! 27 июня


14-1118900080
Ega23
2005-06-16 09:34
2005.07.18
С днем рождения! 16 июня





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский