Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Windows Ereignisnachrichten (https://www.delphipraxis.net/6339-windows-ereignisnachrichten.html)

Tpercon 7. Jul 2003 09:18


Windows Ereignisnachrichten
 
Wie kann ich die von Windows gesendeten Ereignisnachrichten protokollieren?
Wahrscheinlich über RegisterEventSource und ReportEvent, nur damit komm ich noch nicht klar.

Gast 7. Jul 2003 09:58

Re: Windows Ereignisnachrichten
 
1. Das ist "Windows API"!
2. Nachrichten an wen oder was protokollieren? An dein Fenster? An alle Fenster?

Dein Fenster: Die WndProc entsprechend anpassen (bei VCL geht das auch)
Alle Fenster: Message Hook setzen. Dazu siehe:
http://assarbad.net/stuff/tutorials/hooks/

sakura 7. Jul 2003 10:01

Re: Windows Ereignisnachrichten
 
*schwupps*

Oder meinst Du das Ereignisprotokoll?

...:cat:...

Tpercon 7. Jul 2003 10:31

Re: Windows Ereignisnachrichten
 
Ich meine die Ereignisse die man in der Computerverwaltung unter Ereignisanzeige sieht.

Gast 7. Jul 2003 10:44

Re: Windows Ereignisnachrichten
 
LOL ... ziemlich (un)klare Audrucksweise ... danke Sakura :)

Also, kannst du kurz mal erläutern, wieso du ein Protokoll (nix anderes sind die Events in der Eventlog) protokollieren willst?

IMHO a bisserl unsinnig, oder? Oder willst du nur wissen, wann ein Ereignis eingeht, so wie der Ereignismonitor von (fällt mir nicht mehr ein) ...?

Nachtrag: Das ist immernoch Windows API ... und zwar vom Feinsten.

sakura 7. Jul 2003 10:50

Re: Windows Ereignisnachrichten
 
Zitat:

Zitat von Assarbad
Nachtrag: Das ist immernoch Windows API ... und zwar vom Feinsten.

Deswegen ja auch das *schwupps* ;-)

...:cat:...

[edit=Luckie] Jetzt muß ich schon bei einem Supermoderator die Quote-tags korrigieren. :? Mfg, Luckie[/edit]

Tpercon 7. Jul 2003 11:46

Re: Windows Ereignisnachrichten
 
Ich möchte einfach alle Events auflisten, damit ich z.B. eine Nachricht bekomme, wenn etwas bestimmtes passiert.

Gast 7. Jul 2003 11:52

Re: Windows Ereignisnachrichten
 
Ich schreib dir nachmittag wahrscheinlich was, wenn mir keiner zuvor kommt.

Tpercon 7. Jul 2003 12:03

Re: Windows Ereignisnachrichten
 
Nen Beispiel wäre echt klasse! :hello:

Ansonsten besteht halt das große Problem darin, woher weiß ich, wann ein Ereigniss gesendet wird?

Gast 7. Jul 2003 22:19

Re: Windows Ereignisnachrichten
 
Hier ist es: "EventMonTray"

Download und Beschreibung etc HIER

Tpercon 8. Jul 2003 12:31

Re: Windows Ereignisnachrichten
 
Leider bedienst du dich dabei der Ereignisanzeige, weißt du wie ich selbst die EventInfos bekomme?

Gast 8. Jul 2003 13:03

Re: Windows Ereignisnachrichten
 
Manchmal sollte man auch was selber machen. Lustig ist bei mir zumindest vorbei. Nimm:

- ReadEventLog
- GetOldestEventLogRecord
- GetNumberOfEventLogRecords

Wie du die Eventlogs auflistest hast du in meinem Programm mit drin ... wie du sie öffnest auch. Der Rest ist Pillepalle.

Tpercon 8. Jul 2003 14:33

Re: Windows Ereignisnachrichten
 
Nach ewigem Probieren komm ich da trotzdem nicht weiter. Kannst du mir nicht noch nen kleinen Tipp geben? Ich verzweifel mittlerweile daran.

Gast 8. Jul 2003 17:35

Re: Windows Ereignisnachrichten
 
Gedulde dich ...

Gast 9. Jul 2003 22:13

Re: Windows Ereignisnachrichten
 
Schau mal hier.

sakura 9. Jul 2003 22:15

Re: Windows Ereignisnachrichten
 
@Assarbad: Super :hello:

...:cat:...

P.S.: Warum hast Du eigentlich nicht die .com-Domain, die ist doch frei.

Gast 9. Jul 2003 22:22

Re: Windows Ereignisnachrichten
 
.com steht für "commercial" :mrgreen:. Trifft bei mir (noch) nicht zu. .info ist eventuell noch interessant. Mal sehen ...

BTW: Ist in der letzten Stunde "Andromeda" entstanden ;) ... für mehr reicht meine Zeit eh nicht, da ich morgen Konsultation und nächste Woche mündl. Prüfung in Partikeltechnologie habe.

Tpercon 10. Jul 2003 09:54

Re: Windows Ereignisnachrichten
 
:hello: Danke dir!

Hatte vorher das Beispiel von MSDN und kam da an einer Stelle nicht weiter, jetzt hab ich es aber dank deiner Hilfe.

Die Umwandlung von ID [pelr^.EventID mod 32768] und EventType war ja einfach, nur bei der Quelle, Kategorie sowie Beschreibung hapert es noch. Hat da jemand ne Idee?

Tpercon 10. Jul 2003 12:41

Re: Windows Ereignisnachrichten
 
Die Quelle habe ich auch hinbekommen, nur wie bekomme ich die Kategorie, den Benutzer und die Beschreibung?

Gast 10. Jul 2003 19:32

Re: Windows Ereignisnachrichten
 
Wozu ist pelr^.EventID mod 32768 gut? Die EventID ist ein 32bit unsigned Integer - und soll es auch sein ...!

BTW: Bekommt denn heute keiner mehr, der ne Delphi 5 Enterprise hat was auf die Reihe? Ich versteh das immer nicht, da kaufen (?) sich die Leute eine mehrere Tausend Euro teure Entwicklungsumgebung ... aber alles was über "Komponenten auf das Form ziehen" geht, kriegen sie nicht auf die Reihe. Du bist da nicht der erste Fall!

Gast 10. Jul 2003 23:36

Re: Windows Ereignisnachrichten
 
Also ... mehr gibts nun wirklich nicht!

Ich erwarte die Nennung meines Nicks in der Aboutbox, sowie die Angabe meiner URL ( http://assarbad.net )! Ansonsten gelten die Bedingungen der BSDL

Delphi-Quellcode:
function GetEventIDText(EventID: DWORD; msgfile: string; pelr: PEVENTLOGRECORD): string;
type
  PVA_LIST = ^VA_LIST;
  VA_LIST = array[0..0] of Pointer;
var
  hLib: THandle;
  ret, flags, nSize: DWORD;
  ppc, pc, lpc: PChar;
  i: Integer;
//  pval: PVA_LIST;
begin
  result := '';
  flags := FORMAT_MESSAGE_FROM_HMODULE or
    FORMAT_MESSAGE_ALLOCATE_BUFFER or
    FORMAT_MESSAGE_ARGUMENT_ARRAY or
    FORMAT_MESSAGE_IGNORE_INSERTS;
  nSize := ExpandEnvironmentStrings(@msgfile[1], nil, 0) + 2;
  GetMem(pc, nSize);
  if Assigned(pc) then
  try
    ZeroMemory(pc, nSize);
    ExpandEnvironmentStrings(@msgfile[1], pc, nSize);
    for i := lstrlen(pc) - 1 downto 0 do
      if pc[i] = ';' then
        pc[i] := #0;
    lpc := pc;
    while lpc[0] <> #0 do
    begin
      hLib := LoadLibraryEx(lpc, 0, DONT_RESOLVE_DLL_REFERENCES);
      inc(lpc, lstrlen(lpc) + 1);
      if hLib <> 0 then
      try
        ret := FormatMessage(flags, Pointer(hLib), EventID, LANG_USER_DEFAULT, @ppc, 0, nil);
        if ((ret = 0) and (GetLastError = ERROR_MR_MID_NOT_FOUND) and (lpc[0] <> #0)) then
          Continue;
      finally
        FreeLibrary(hLib);
      end;
    end;
    if ret <> 0 then
      SetString(result, ppc, lstrlen(ppc));
    if Assigned(ppc) then
      LocalFree(THandle(ppc));
  finally
    Freemem(pc);
  end;
// TODO: insert the replacement strings!
end;

function GetEventRecordString(pelr: PEVENTLOGRECORD; el: PChar): MYEVENTLOGRECORD;
(*
  This function extracts the data from a EVENTLOGRECORD and the trailing data!
  "el" is the name of the Eventlog read. It is used to determine the event source.
*)
const
  elkey = 'SYSTEM\CurrentControlSet\Services\Eventlog\';
var
  ft: FILETIME;
  pc: PChar;
  uName,
    dName: array[0..MAX_PATH - 1] of Char;
  err, uSize, dSize, use: DWORD;
  key: HKEY;
  temps: string;
begin
// Fill record with zeroes
  ZeroMemory(@result, sizeof(result));
// Fill different members
  result.RecordNumber := pelr^.RecordNumber;
  result.EventID := pelr^.EventID;
// Convert unix type time format to local filetime
  ft := UnixTimeToFileTime(pelr^.TimeGenerated);
  FileTimeToLocalFileTime(ft, result.LocalTimeGenerated);
// ... twice
  ft := UnixTimeToFileTime(pelr^.TimeWritten);
  FileTimeToLocalFileTime(ft, result.LocalTimeWritten);
// Fill more members
  result.EventType := pelr^.EventType;
  result.EventCategory := pelr^.EventCategory;
// Check wether we need to copy data
  if pelr^.DataLength <> 0 then
  begin
    SetLength(result.Data, pelr^.DataLength);
// Copy the data into a string ... this might be more convenient to handle
    CopyMemory(@result.Data[1], PAdd(pelr, pelr^.DataOffset), pelr^.DataLength);
  end;
// Get event source name
  pc := PAdd(pelr, sizeof(pelr^));
  SetString(result.SourceName, pc, lstrlen(pc));
// Go to computer name ...
  inc(pc, lstrlen(pc) + 1);
  SetString(result.ComputerName, pc, lstrlen(pc));
  uSize := sizeof(uName);
  dSize := sizeof(dName);
// Is there a SID
  if pelr^.UserSidLength <> 0 then
// Yes, so look up its name ...
    if LookUpAccountSid(pc, PAdd(pelr, pelr^.UserSidOffset), uName, uSize, dName, dSize, use) then
// And set it
      result.UserName := Format('\\%s\%s', [@dName, @uName]);
// Use a temporary variable
  temps := elkey + string(el) + '\' + result.SourceName;
// Try to get the name for the library containing the message string
  err := RegOpenKey(HKEY_LOCAL_MACHINE, @temps[1], key);
  if err = ERROR_SUCCESS then
  try
    dSize := 0;
    RegQueryValueEx(key, 'EventMessageFile', nil, nil, nil, @dSize);
    begin
      GetMem(pc, dSize);
      if Assigned(pc) then
      try
        ZeroMemory(pc, dSize);
        if RegQueryValueEx(key, 'EventMessageFile', nil, nil, PByte(pc), @dSize) = ERROR_SUCCESS then
          SetString(result.SourceFile, pc, lstrlen(pc));
      finally
        FreeMem(pc);
      end;
    end;
  finally
    RegCloseKey(key);
  end;
// If we found a source file ...
  if result.SourceFile <> '' then
    result.MessageText := GetEventIDText(result.EventID, result.SourceFile, pelr);
end;

Tpercon 11. Jul 2003 08:57

Re: Windows Ereignisnachrichten
 
Danke!
Ne kleine Frage aber noch. Was macht das PAdd(), was ist das für ne Function? Da bekomm ich immer undefinierter Bezeichner.

Gast 11. Jul 2003 10:49

Re: Windows Ereignisnachrichten
 
Ist alles beim Sourcecode von Eventloglister dabei. Die Funktion addiert eine Zahl zu einer Adresse (Pointer).

Tpercon 16. Jul 2003 13:48

Re: Windows Ereignisnachrichten
 
Wie komme ich an die insertion strings?

Gast 16. Jul 2003 22:42

Re: Windows Ereignisnachrichten
 
Istn Scherz, oder? Der Code wird zwar nicht benutzt, aber er ist drin. Also bitte nochmal schauen! Habe morgen mündl. Prüfung!

Tpercon 17. Jul 2003 08:42

Re: Windows Ereignisnachrichten
 
Eigentlich sollte ich dies ja über NumStrings und StringOffset bekommen, doch irgendwie geht das über diese Positionen nicht. :( Ich bekomm immer nur den ersten und weiß nicht wie ich an die anderen komme?

Viel Erfolg bei deiner mündl. Prüfung!

Tpercon 18. Jul 2003 08:59

Re: Windows Ereignisnachrichten
 
Woher weiß ich die Anzahl insertion strings? Der Wert von NumStrings ist das nämlich nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz