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

Вниз

Информация о процессах   Найти похожие ветки 

 
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 вся ветка

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

Наверх




Память: 0.53 MB
Время: 0.049 c
8-1096649813
Александр Орлов
2004-10-01 20:56
2005.01.02
Этот TMediaPlayer не в моем духе


3-1102061807
SergP.
2004-12-03 11:16
2005.01.02
DBGridEh отловить оконч. редакт. ячейки, но до обработчика ошибок


3-1101976169
Sholoma
2004-12-02 11:29
2005.01.02
MySQL


14-1103133821
Чеширский_Кот
2004-12-15 21:03
2005.01.02
Болельщики Зенита сегодня молятся на греков


1-1102711678
viksoft
2004-12-10 23:47
2005.01.02
Отображение документов *.doc *.pdf