Форум: "WinAPI";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
Внизсписок процессов Найти похожие ветки
← →
Чайник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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.011 c