Unit Events;

{
  Tento soubor implementuje zobrazovani
  jednotlivych typu udalosti posilanych
  ovladacem logptm.
}

Interface

Uses
  DriverCommands, Comctrls;

Procedure DisplayEvent(E:PUM_EVENT; L:TListItem);

Implementation

Uses
  Windows, SysUtils, Utils;

Procedure DisplayProcessEvent(EP:PEVENT_PROCESS; L:TListItem);
{
  Prevede zaznam udalosti procesu na jeden radek
  v komponente ListView, ktera slouzi k zobrazovani
  udalosti.
}
begin
L.SubItems.Add(GetProcessName(EP.CreatorPID) + ' [' + IntToStr(EP.CreatorPID) + ']');
L.SubItems.Add(IntToStr(EP.CreatorTID));
If EP.Created Then
  begin
  L.SubItems.Add('Vytvořil proces');
  L.SubItems.Add('Nový proces: '+ GetProcessName(EP.PID) +  ' [' + IntToStr(EP.PID) + '], Rodič: ' + IntToStr(EP.ParentPID) + ' [' + GetProcessName(EP.ParentPID) + ']');
  end
Else begin
  L.SubItems.Add('Proces ukončen');
  L.SubItems.Add('-');
  end;
end;

Procedure DisplayThreadEvent(ET:PEVENT_THREAD; L:TListItem);
{
  Prevede informace ziskane ze zaznamu o udalosti vlakna
  do jednoho radku komponenty ListView, ktera je
  zodpovedna za zobrazovani udalosti.
}
begin
L.SubItems.Add(GetProcessName(ET.CreatorPID) + ' [' + IntToStr (ET.CreatorPID) + ']');
L.SubItems.Add(IntToStr(ET.CreatorTID));
If ET.Created Then
  begin
  L.SubItems.Add('Vytvořil vlákno');
  L.SubItems.Add('TID: ' + IntToStr(ET.TID) + ', proces: ' + GetProcessName(ET.PID) + ' [' + IntToStr(ET.PID) + ']');
  end
Else begin
  L.SubItems.Add('Vlákno ukončeno');
  L.SubItems.Add('-');
  end;
end;

Procedure DisplayImageEvent(EI:PEVENT_IMAGE; L:TListItem);
{
  Ziska ze zaznamu o udalosti modulu vsechny informace
  a zobrazi je do jednoho radku komponenty ListView.
}
Var
  Name : WideString;
begin
L.SubItems.Add(GetProcessName(EI.PID) + ' [' + IntToStr(EI.PID) + ']');
L.SubItems.Add(IntToStr(EI.TID));
L.SubItems.Add('Načetl modul');
Name := Copy(PWideChar(@EI.Name), 1, EI.NameLength Div SizeOf(WideChar));
L.SubItems.Add(Name + ', adresa: ' + IntToHex(EI.BaseAddress, GetPointerLength * 2) + ', velikost: ' + IntToStr(EI.Size))
end;

Procedure DisplayEvent(E:PUM_EVENT; L:TListItem);
{
  Predzpracuje zaznam udalosti. Provedou se operace,
  ktere nezavisi na typu zachycene udalosti.
}
Var
  EP : PEVENT_PROCESS;
  EI : PEVENT_IMAGE;
  ET : PEVENT_THREAD;
begin
// Prvni sloupec obsahuje cas vzniku udalosti.
L.Caption := DateTimeToStr(Now);
// Podle typu udalosti se preda rizeni prislusne
// procedure. Informace specificke pro urcity typ
// udalosti se nachazeji tesne za zaznamem UM_UDALOST.
Case E.EventType Of
  EVENT_TYPE_PROCESS :
    begin
    // Udalost procesu
    EP := PEVENT_PROCESS(PByte(E) + SizeOf(UM_EVENT));
    DisplayProcessEvent(EP, L);
    end;
  EVENT_TYPE_THREAD :
    begin
    // udalost vlakna
    ET := PEVENT_THREAD(PByte(E) + SizeOf(UM_EVENT));
    DisplayThreadEvent(ET, L);
    end;
  EVENT_TYPE_IMAGE  :
    begin
    // Udalost modulu
    EI := PEVENT_IMAGE(PByte(E) + SizeOf(UM_EVENT));
    DisplayImageEvent(EI, L);
    end;
  end;
end;

End.

