Главная страница
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.031 c
3-30239
SasaR
2003-03-20 15:43
2003.04.10
FrameWork:FIBDataset


14-30551
Supreme 2
2003-03-23 17:14
2003.04.10
Первые плоды творчества


3-30310
ksushishka
2003-03-18 18:23
2003.04.10
Не могу вытащить из поля типа TBlobField иконку в Gif формате


14-30510
Supreme 2
2003-03-23 22:02
2003.04.10
Какие лучше?


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