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

Тема в разделе "Delphi - Система", создана пользователем NetDigger, 23 ноя 2004.

Статус темы:
Закрыта.
  1. NetDigger

    NetDigger Гость

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

    Barmutik Гость

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

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

    Код (Text):
    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.
     
  3. Barmutik

    Barmutik Гость

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

    Код (Text):
    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.
     
  4. CR@ZY J@X

    CR@ZY J@X Гость

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

    Barmutik Гость

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

    Она переопределяет системные функции общения с реестром на себя и потом уже вызывает реальные... т.е имеет полный контроль ...
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей