Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1103124226
sashok
2004-12-15 18:23
2005.01.02
Как поменять строку в реестре


14-1103033566
Kerk
2004-12-14 17:12
2005.01.02
ТМО и полигоны


14-1102921584
able
2004-12-13 10:06
2005.01.02
Акустика..


1-1103138876
Xupypr
2004-12-15 22:27
2005.01.02
ListView


14-1102688012
REA
2004-12-10 17:13
2005.01.02
А что же есть это ломание сайтов?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский