![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
список процессов [D5, D6, NT4]
Чайник32 © (2003-02-10 15:53:00)Довольно недавно нашел функцию нахождения списка процессов 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). Подскажите плиз, как пофиксить эту неприятность.
Чайник32 (2003-02-10 18:46:00) [1]спасибо, попробую разобраться.
Игорь Шевченко (2003-02-10 17:55:00) [2]В кладовке лежит программа QuerySystemInformation - перечисляет, кроме всего прочего, список процессов. Может, что оттуда можно использовать ?
Чайник32 (2003-02-10 17:22:00) [3]проверил - GetLastError после строки ph:=OpenProcess... выдает 5 (отказано в доступе)...
ZZ (2003-02-10 16:52:00) [4]Может, неможет... Лучше посмотри где валится программа и какую ошибку возвращает функция (которая валится)
Чайник32 (2003-02-10 16:49:00) [5]установка Debug привилегии моему процессу ничего не дала :(
Игорь Шевченко (2003-02-10 16:23:00) [6]Установить Debug priviledge