Форум: "WinAPI";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
ВнизИнформация о процессах Найти похожие ветки
← →
Unnicked (2004-11-11 13:45) [0]Проблема такая: получаю список процессов (CreateToolhelp32Snapshot), затем с помощью GetProcessMemoryInfo узнаю память, занятую процессом и т. д. Однако не удается получить инфо о некоторых процессах (например, об Антивирусе Касперского): не выводится даже его приоритет. С чем это может быть связано?
← →
Digitman © (2004-11-11 13:48) [1]
> С чем это может быть связано?
наверно, с тем что Касперский - не такой уж и болван, что позволит всякому "любопытствующему" иметь инф-цию о том, что он, Касперский. в дан.момент творит на машине ... на то он и Касперский, а не какой-нть КевинМитник
← →
Unnicked (2004-11-11 13:59) [2]В том-то и дело, что не только Касперский. Прога, например, не может определить инфо о процессах, запущенных не от имени юзера (например, от имени NETWORK SERVICE и т. п.).
← →
kaZaNoVa © (2004-11-11 14:02) [3]Unnicked (11.11.04 13:59) [2]
может прав не хватает ?
← →
Unnicked (2004-11-11 14:08) [4]Может быть. А как можно решить эту проблему? Неужели пользовательская программа не может получить полную инфу о все процессах, запущенных в системе? Если кто знает способ-подскажите, please.
← →
Digitman © (2004-11-11 14:10) [5]
> Unnicked (11.11.04 14:08) [4]
процессы как открываешь ? с какими опциями ?
← →
Unnicked (2004-11-11 14:15) [6]Вот так:
hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
ProcessCount:=0;
if Process32First(hSnap,pe32) then
repeat
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION,
false,
pe32.th32ProcessID);
ProcInfoList[ProcessCount].Priority:=GetPriorityClass(hProcess);
// Объем занимаемой памяти
if GetProcessMemoryInfo(hProcess, pmc, cb) then
ProcInfoList[ProcessCount].UsedMemory:= Round(pmc^.WorkingSetSize/1024)
else ProcInfoList[ProcessCount].UsedMemory:=-1;
CloseHandle(hProcess);
Inc(ProcessCount);
until not Process32Next(hSnap,pe32); // пока есть процессы
← →
NAlexey © (2004-11-11 14:31) [7]>Unnicked
Тебе нужны SeDebugPrivilege...
← →
Unnicked (2004-11-11 14:36) [8]>NAlexey
А как ими пользоваться? Если можно, с примером.
← →
kaZaNoVa © (2004-11-11 14:38) [9]Unnicked (11.11.04 14:36) [8]
function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
if LookupPrivilegeValue(nil, PChar("SeDebugPrivilege"), tkp.Privileges[0].Luid) then
begin
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
end;
end;
end;
← →
Digitman © (2004-11-11 14:38) [10]
> NAlexey © (11.11.04 14:31) [7]
опять же - частный случай ... хотя и верная подсказка ...
но в случае с тем же Касперским и эти ухищрения могут и не дать ожидаемый рез-т ... на то он и а/вир софт, чтобы не всякий "любопытствующий" мог сунуть всой нос в код а/вир программы документированными способами
← →
Unnicked (2004-11-11 14:45) [11]Спасибо за пример, но не помогло. Может, есть еще какие-то способы?
← →
Digitman © (2004-11-11 15:07) [12]
> Unnicked (11.11.04 14:45) [11]
старче, ты можешь вразумительно объяснить, чего тебе надобно от GetProcessMemoryInfo ?
какую инф-цию и о какой памяти ты ожидаешь получить с пом.этой ф-ции ?
осознаешь ли ты, что эта ф-ция дает лишь МГНОВЕННЫЕ результаты ? которые через сотые доли секунды могут измениться ?
← →
NAlexey © (2004-11-11 15:26) [13]Не стал специально из за этого случая ставить AVP, лишь могу предложить свою реализацию, попробуй, может получится:
procedure GetPrivilege;
var
DebugNameValue: TLargeInteger;
hToken: THandle;
dwRet: DWORD;
Privileges: TOKEN_PRIVILEGES;
begin
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
LookupPrivilegeValue(nil, "SeDebugPrivilege", DebugNameValue);
Privileges.PrivilegeCount := 1;
Privileges.Privileges[0].Luid := DebugNameValue;
Privileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, Privileges, SizeOf(Privileges), nil, dwRet);
CloseHandle(hToken);
end;
const
BELOW_NORMAL_PRIORITY_CLASS = 16384;
ABOVE_NORMAL_PRIORITY_CLASS = 32768;
procedure TForm1.Button1Click(Sender: TObject);
var
hSnapShot: THandle;
ProcInfo: TProcessEntry32;
function SPriority(dwIn: dword): string;
begin
Result := "";
case dwIn of
NORMAL_PRIORITY_CLASS:
Result := "Средний";
BELOW_NORMAL_PRIORITY_CLASS:
Result := "Ниже среднего";
IDLE_PRIORITY_CLASS:
Result := "Низкий";
ABOVE_NORMAL_PRIORITY_CLASS:
Result := "Выше среднего";
HIGH_PRIORITY_CLASS:
Result := "Высокий";
REALTIME_PRIORITY_CLASS:
Result := "Реального времени";
end;
end;
procedure AddProcInfo;
var
hProcess: THandle;
dwWorkingSize: DWORD;
ProcessCounters: PPROCESS_MEMORY_COUNTERS;
Size: DWORD;
begin
hProcess := OpenProcess (PROCESS_ALL_ACCESS, False,
ProcInfo.th32ProcessID);
if hProcess = 0 then
Exit;
dwWorkingSize := 0;
Size := SizeOf(_PROCESS_MEMORY_COUNTERS);
GetMem(ProcessCounters, Size);
try
ProcessCounters^.cb := Size;
if GetProcessMemoryInfo(hProcess, ProcessCounters, Size) then
dwWorkingSize := ProcessCounters^.WorkingSetSize div 1024;
finally
FreeMem(ProcessCounters);
end;
Memo1.Lines.Add("---------------------------------------------------------");
Memo1.Lines.Add("- Name: " + ProcInfo.szExeFile);
Memo1.Lines.Add(Format("- PID: %d", [ProcInfo.th32ProcessID]));
Memo1.Lines.Add("- Priority: " + SPriority(GetPriorityClass(hProcess)));
Memo1.Lines.Add(Format("- WorkingSize: %d", [dwWorkingSize]));
CloseHandle(hProcess);
end;
begin
GetPrivilege;
hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapShot <> THandle(-1)) then
begin
ProcInfo.dwSize := SizeOf(ProcInfo);
if (Process32First(hSnapshot, ProcInfo)) then
begin
AddProcInfo;
while (Process32Next(hSnapShot, ProcInfo)) do
AddProcInfo;
end;
CloseHandle(hSnapShot);
end;
end;
← →
Unnicked (2004-11-12 15:44) [14]>NAlexey
Спасибо, все работает!!!
← →
Digitman © (2004-11-12 15:50) [15]
> Unnicked (12.11.04 15:44) [14]
> Спасибо за пример, но не помогло
> Спасибо, все работает
и чем же, позволь полюбопытствовать, [9] (не работает) принципиально отличается от [13] (работает) в части установки привелегий ?
или ты не знал в принципе, куда код из [9] приткнуть, пока тебе в [14] до манной каши не разжевали ?
печально это
← →
kaZaNoVa © (2004-11-12 16:47) [16]по сабжу - freememory - супер тулза, выдаёт инфы о памяти , бесплатна, поставляется с исходниками !
сайт проги: http://www.hcsoft.spb.ru
зы чтобы скачать исходник там надо зарегаться, рега бесплатна ;)
← →
Unnicked (2004-11-12 17:32) [17]Не, это я погорячился, не помогло :(( Этот код просто добавляет в Memo те процессы, о которых ВОЗМОЖНО получить инфо о памяти и игнорирует те, у которых не может... Сейчас попробую заглянуть на http://www.hcsoft.spb.ru
← →
Unnicked (2004-11-12 17:43) [18]Не, freememory-это не то, что мне было нужно. Мне нужно получить объем памяти, занимаемый КАЖДЫМ процессом в системе, а не общую инфу о памяти
← →
nomshar (2004-11-15 16:17) [19]
> Unnicked
А ты не пробовал функцию NtQuerySystemInformation?
Очень хорошая функция (есть подозрение, хе, что Process Explorer Руссиновича использует именно ее, хотя не факт).
Функция хорошая, выдает довольно-таки много информации о запущенных в системе процессах.
← →
Unnicked (2004-11-15 16:50) [20]Не, еще не пробовал. А она переопределена в Delphi? Если да, то в каком модуле она находится?
← →
nomsha (2004-11-16 11:17) [21]
> Unnicked
Вынужден тебя огорчить. В дельфях прототипа этой функции нет.
Но думаю, это не страшно. Находиться NtQuerySystemInformation в библиотеке ntdll.dll.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/ntquerysysteminformation.asp
Так что, уверен, у тебя не составит трудов загрузить библиотеку и вызвать из нее соответствующую функцию.
← →
nomshar (2004-11-16 11:19) [22]И еще. (Я в последнем сообщении в своем имени ошибься).
Может тебе поможет информация отсюда:
http://delphiworld.narod.ru/base/loaded_drvs_nt.html
← →
Игорь Шевченко © (2004-11-16 11:56) [23]nomsha (16.11.04 11:17) [21]
http://www.schevchenko.net.ru/SRC/QuerySystemInformation_60.zip
← →
Unnicked (2004-11-16 13:13) [24]Ура!!! Все замечательно работает! Огромное спасибо всем, а особенно nomshar"у и Игорю Шевченко.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.038 c