Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.10;
Скачать: CL | DM;

Вниз

список процессов   Найти похожие ветки 

 
Чайник32   (2003-02-10 15:53) [0]

Довольно недавно нашел функцию нахождения списка процессов PSAPI:

function GetAllProcessesInfo(ExtractFullPath: Boolean; procname: string): longint;

function ExtractExeFromModName(ModuleName: String):String;
begin
ExtractExeFromModName := Copy(ModuleName,LastDelimiter("\",ModuleName)+1,Length(ModuleName));;
end;

function GetProcessInfo(PID: WORD):LPMODULEINFO;
var
RetVal: LPMODULEINFO;
hProc: DWORD;
hMod: HMODULE;
cm:cardinal;
begin
hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false, PID);
GetMem(RetVal,sizeOf(LPMODULEINFO));
if not(hProc = 0) then
begin
EnumProcessModules(hProc, @hMod, 4, cm);
GetModuleInformation(hProc,hMod,RetVal,SizeOf(RetVal));
end;
GetProcessInfo := RetVal;
end;

var ProcList: Array [0..$FFF] of DWORD;
RetVal: TLpModuleInfoArray;
ProcCnt: Cardinal;
I,MaxCnt: WORD;
ModName:array[0..max_path] of char;
ph,mh: THandle;
cm: Cardinal;

begin
EnumProcesses(@ProcList,sizeof(ProcList),ProcCnt);
MaxCnt := ProcCnt div 4;
SetLength(RetVal,MaxCnt);

for i := Low(RetVal) to High(RetVal) do
begin
//Nenoaiiua i?ioannu
case ProcList[i] of
0:begin
RetVal[i].ModuleName := "System Idle Process";
RetVal[i].ModulePID := 0;
RetVal[i].ModuleInfo := GetProcessInfo(i);
end;
2,4,8:begin
RetVal[i].ModuleName := "System";
RetVal[i].ModulePID := 8;
RetVal[i].ModuleInfo := GetProcessInfo(i);
end
//Inoaeuiua
else
begin
RetVal[i].ModulePID := ProcList[i];
RetVal[i].ModuleInfo := GetProcessInfo(ProcList[i]);
//get module name
ph:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false, ProcList[i]);
if ph>0 then
begin
EnumProcessModules(ph, @mh, 4, cm);
GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
if (ExtractFullPath) then
RetVal[i].ModuleName := string(ModName)
else
RetVal[i].ModuleName := ExtractExeFromModName(string(ModName));
end
else
RetVal[i].ModuleName := "UNKNOWN";
CloseHandle(ph);
end;
end;
end;

ProcessList.Clear;
for i := Low(RetVal) to High(RetVal) do
ProcessList.Add(RetVal[i].ModuleName);

for i := Low(RetVal) to High(RetVal) do
if RetVal[i].ModuleName=procname then begin
result:= RetVal[i].ModulePID;
break;
end;
// GetAllProcessesInfo := RetVal;
end;


Проблема состоит в том, что если находить список под обычным узером, процедура не может найти имена системных процессов (видимо не может открыть процесс OpenProcess"ом и выдает значение 0). Подскажите плиз, как пофиксить эту неприятность.


 
Игорь Шевченко ©   (2003-02-10 16:23) [1]

Установить Debug priviledge


 
Чайник32   (2003-02-10 16:49) [2]

установка Debug привилегии моему процессу ничего не дала :(


 
ZZ ©   (2003-02-10 16:52) [3]

Может, неможет... Лучше посмотри где валится программа и какую ошибку возвращает функция (которая валится)


 
Чайник32   (2003-02-10 17:22) [4]

проверил - GetLastError после строки ph:=OpenProcess... выдает 5 (отказано в доступе)...


 
Игорь Шевченко ©   (2003-02-10 17:55) [5]

В кладовке лежит программа QuerySystemInformation - перечисляет, кроме всего прочего, список процессов. Может, что оттуда можно использовать ?


 
Чайник32   (2003-02-10 18:46) [6]

спасибо, попробую разобраться.



Страницы: 1 вся ветка

Текущий архив: 2003.04.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
1-30420
KpeHgeJIb
2003-03-29 15:02
2003.04.10
Вопрос о TListView


4-30641
yuravss
2003-02-09 16:00
2003.04.10
Как снимать скриншоты десктопа без тормозов


3-30257
Tomkat_s
2003-03-21 11:58
2003.04.10
Базы BTR


3-30227
Surgeon
2003-03-20 17:16
2003.04.10
Доступ к .mdb без изменения внешних параметров


1-30381
BJValentine
2003-03-29 14:20
2003.04.10
DBGrid