Мониторинг процессов

  • Автор темы NetDigger
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

NetDigger

Здравствуйте, уважаемые!
Написал я монитор процессов - выводит какие процессы выполняются сейчас, их ИДы, родительские ИДы, сколько они уже работают, файлы, окна и т.д. Обновление пока делаю по таймеру - т.е. каждый раз снэпшот и пошел сравнивать - если такого ИДа уже нет, то значит процесс умер и следовательно из списка нужно его убрать. Замечательно! Только вот работает долговато - возможны ли альтернативы. Кроме того, выводится это все дело в виде дерева, чтобы можно было понять, какой процесс что породил =)Т.е. если пользователь открыл какой-либо узел, то по срабатыванию таймера дерево перерисовывается, естественно со свернутыми узлами - тоже проблемка. Если записывать имена узлов, которые открыты, а при перерисовки сравнивать и открывать? И еще: можно ли какими-нибудь средствами вывести счетчики производительности процесса: сколько байтов-ввод/вывод, количество чтений и т.д, т.е. аналог диспетчера задач NT. Спросите зачем нужно - да вот озадачили курсовым =) Базовые задания сделаны, но хочется чего-то большего и чистого - для собственного развития.
С уважением.
 
B

Barmutik

Насчёт сколько вводова выводов и т.д... код ниже... а насчёт перерисовок .. опять же повторюсь ... используй виртуальный контрол... и не будет тебе никаких перерисовок... Да и кстати твой монитор процессов работает на Win9x? В Jedi есть функция она там в зависимости от системы процессы выдёргивает... может тебе чем поможет RunningProcessesList... и она мне мгновенно отдаёт список процессов...

КОД НЕ МОЙ! 100% работоспособность не гарантирую!

Код:
unit PrsList;

interface

uses Classes,Windows,SysUtils;

type
TProcess=class
public
 ThreadCount     : dword;
 CreationTime    : TFileTime;
 ProcessName     : string;
 BasePriority    : dword;
 ProcessID      : dword;
 ParentProcessID   : dword;
 HandleCount     : dword;
 VirtualBytesPeak  : dword;
 VirtualBytes    : dword;
 PageFaults     : dword;
 WorkingSetPeak   : dword;
 WorkingSet     : dword;
 PagedPool      : dword;
 NonPagedPool    : dword;
 PageFileBytesPeak  : dword;
 PageFileBytes    : dword;
 PrivateBytes    : dword;
end;

TProcessList=class(TList)
protected
 function GetProcess(idx : integer) : TProcess;
public
 constructor Create;
 destructor Destroy;override;
 procedure Refresh;
 property Processes[idx : integer] : TProcess read GetProcess;
end;

implementation

function NtQuerySystemInformation(dt : dword;
buf : pointer;
bufsize : dword;
retlen : pointer) : dword;stdcall;external 'ntdll.dll';

type
PBA = ^TBA;
TBA = array[0..1000000] of byte;

PThreadInfo = ^TThreadInfo;
TThreadInfo = record
ftCreationTime : TFileTime;
dwUnknown1 : dword;
dwStartAddress : dword;
dwOwningPID : dword;
dwThreadID : dword;
dwCurrentPriority : dword;
dwBasePriority : dword;
dwContextSwitches : dword;
dwThreadState : dword;
dwUnknown2 : dword;
dwUnknown3 : dword;
dwUnknown4 : dword;
dwUnknown5 : dword;
dwUnknown6 : dword;
dwUnknown : dword;
end;

PProcessInfo = ^TProcessInfo;
TProcessInfo=record
dwOffset      : dword; // an ofset to the next Process structure
dwThreadCount    : dword;
dwUnkown1      : array[0..5] of dword;
ftCreationTime   : TFileTime;
dwUnkown2      : dword;
dwUnkown3      : dword;
dwUnkown4      : dword;
dwUnkown5      : dword;
dwUnkown6      : dword;
pszProcessName   : PWideChar;
dwBasePriority   : dword;
dwProcessID     : dword;
dwParentProcessID  : dword;
dwHandleCount    : dword;
dwUnkown7      : dword;
dwUnkown8      : dword;
dwVirtualBytesPeak : dword;
dwVirtualBytes   : dword;
dwPageFaults    : dword;
dwWorkingSetPeak  : dword;
dwWorkingSet    : dword;
dwUnkown9      : dword;
dwPagedPool     : dword; // kbytes
dwUnkown10     : dword;
dwNonPagedPool   : dword; // kbytes
dwPageFileBytesPeak : dword;
dwPageFileBytes   : dword;
dwPrivateBytes   : dword;
dwUnkown11     : dword;
dwUnkown12     : dword;
dwUnkown13     : dword;
dwUnkown14     : dword;
ThreadInfo : PThreadInfo; // Thread list
end;

function TProcessList.GetProcess;
begin
Result:=TProcess(Items[idx]);
end;

constructor TProcessList.Create;
begin
inherited Create;
end;

destructor TProcessList.Destroy;
var
i : integer;
begin
if Count>0 then
for i:=0 to Count-1 do
 TProcess(Items[i]).Free;
inherited Destroy;
end;

procedure TProcessList.Refresh;
var
i,rl,cp : dword;
pinfo : PProcessInfo;
buf : PBA;
pcs : TProcess;
begin
if Count>0 then
for i:=0 to Count-1 do
 TProcess(Items[i]).Free;
Clear;
GetMem(buf,$10000);
rl:=0;
i:=NtQuerySystemInformation(5,buf,$10000,@rl);
if i=0 then begin
cp:=0;
repeat
 pinfo:=PProcessInfo(@buf[cp]);
 cp:=cp+pinfo.dwOffset;
 pcs:=TProcess.Create;
 with pinfo^ do begin
 pcs.ThreadCount:=dwThreadCount;
 pcs.CreationTime:=ftCreationTime;
 if pszProcessName<>nil then
  pcs.ProcessName:=WideCharToString(pszProcessName)
 else
  pcs.ProcessName:='System Idle';
 pcs.BasePriority:=dwBasePriority;
 pcs.ProcessID:=dwProcessID;
 pcs.ParentProcessID:=dwParentProcessID;
 pcs.HandleCount:=dwHandleCount;
 pcs.VirtualBytesPeak:=dwVirtualBytesPeak;
 pcs.VirtualBytes:=dwVirtualBytes;
 pcs.PageFaults:=dwPageFaults;
 pcs.WorkingSetPeak:=dwWorkingSetPeak;
 pcs.WorkingSet:=dwWorkingSet;
 pcs.PagedPool:=dwPagedPool;
 pcs.NonPagedPool:=dwNonPagedPool;
 pcs.PageFileBytesPeak:=dwPageFileBytesPeak;
 pcs.PageFileBytes:=dwPageFileBytes;
 pcs.PrivateBytes:=dwPrivateBytes;
 Add(pcs);
 end;
until pinfo.dwOffset=0;
end;
FreeMem(buf);
end;

end.
 
B

Barmutik

Вот кстати из хелпа... может не совсем в тему но в ту сторону надо копать явно:

Нou can use the WH_SHELL hook to spy on the creation of the unowned
top-level windows, and then check the name of the process.
Then you can capture the HSHELL_WINDOWDESTROYED notification (thru'
the same WH_SHELL hook)
Код:
function ShellProc(nCode: integer;
         wParam   : WPARAM;
         lParam   : LPARAM): LRESULT; stdcall;
begin
if nCode >= 0
  then begin
     case nCode of
        HSHELL_WINDOWCREATED: // you get here as a new 
  // unowned window is created.
  // the wParam contains the 
  //window handle.

        end;
     CallNextHookEx(hShellHook, nCode, wParam, lParam);
    end
  else CallNextHookEx(hShellHook, nCode, wParam, lParam);
Result := 0; // Requirement of ShellProc
end;

procedure SetHook; stdcall;
begin
if hShellHook = 0
 then hShellHook := SetWindowsHookEx(WH_SHELL,
                   ShellProc,
                   HInstance, 0);
end;

procedure ResetHook; stdcall;
begin
UnhookWindowsHookEx(hShellHook);
hShellHook = 0
end;

exports
   SetHook,
   ResetHook,
   ShellProc;

begin
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
 
C

CR@ZY J@X

Товарищи, а каким макаром можно выжать информацию об изменениях в реестре под ХР? Есть ф-ия RegNotifyChangeKeyValue? но от нее толку мало - можно лишь получить уведомление...
 
B

Barmutik

Как например делает утилитка от SysInternal.com.

Она переопределяет системные функции общения с реестром на себя и потом уже вызывает реальные... т.е имеет полный контроль ...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:  ТелеграмВконтактеДзенФейсбукТвиттерЮтуб