AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi fehlerhafte/merkwürdige EventID beim Auslesen des EventLog
Thema durchsuchen
Ansicht
Themen-Optionen

fehlerhafte/merkwürdige EventID beim Auslesen des EventLog

Ein Thema von Klaus01 · begonnen am 13. Jul 2009 · letzter Beitrag vom 13. Jul 2009
Antwort Antwort
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#1

fehlerhafte/merkwürdige EventID beim Auslesen des EventLog

  Alt 13. Jul 2009, 18:46
Guten Abend,

ich brüte schon den ganzen Tag über dieses Problem und
finde nicht so recht einen Problemgrund.

Hier die Ausgabe von meinem Programm
es wird der aktuellste Eintrag des EventLogs ausgegeben.

Application
2437
3221356552 -> sollte 8 sein [eventID]
1 -> stimmt [eventType]
Internet Explorer
0
Security
2092
576 -> stimmt [eventID]
8 -> stimmt [eventType]
System
2501
1073748860 -> sollte 7036 sein [eventID]
4 -> stimmt [eventType]


Laut msdn soll die Struktur eines Eintrags so aussehen:
Code:
typedef struct _EVENTLOGRECORD {
  DWORD Length;
  DWORD Reserved;
  DWORD RecordNumber;
  DWORD TimeGenerated;
  DWORD TimeWritten;
  DWORD EventID;
  WORD EventType;
  WORD NumStrings;
  WORD EventCategory;
  WORD ReservedFlags;
  DWORD ClosingRecordNumber;
  DWORD StringOffset;
  DWORD UserSidLength;
  DWORD UserSidOffset;
  DWORD DataLength;
  DWORD DataOffset;
}EVENTLOGRECORD, *PEVENTLOGRECORD;
In Delphi habe ich das so umgesetzt:
Delphi-Quellcode:
  PEventLogRecord = ^TEventLogRecord;
  TEventLogRecord = packed record
    length : DWORD;
    reserved : DWORD;
    recordNumber : DWORD;
    timeGenerated : DWORD;
    timeWritten : DWORD;
    eventID : DWORD;
    eventType : Word;
    numString : Word;
    eventCategory : Word;
    reservedFlag : Word;
    closingRecordNumber : DWORD;
    stringOffset : DWORD;
    userSidLength : DWORD;
    userSidOffset : DWORD;
    dataLength : DWORD;
    dataOffset : DWORD;
  end;
Das Auslesen mache ich mit diesem Code:
Delphi-Quellcode:
procedure TThreadMonEventLog.execute;
const
  EVENTLOG_SEQUENTIAL_READ = 1;
  EVENTLOG_SEEK_READ = 2;
  EVENTLOG_FORWARDS_READ = 4;
  EVENTLOG_BACKWARDS_READ = 8;
var
  hEventLog: THandle;
  lastRecNo: DWORD;
  event: TEventLogrecord;
  pEvent : PEventLogRecord;
  byteCount: Cardinal;
  minByteCount: Cardinal;
  i: Byte;
  errorCode: Boolean;
begin
  for i:=0 to high(eventLogList) do
    begin
      hEventLog:=openEventLog(nil,pchar(eventLogList[i].name));
      if hEventLog > 0 then
        begin
          getNumberOfEventLogRecords(hEventLog,lastRecNo);
          WriteLn(eventLogList[i].name);
          WriteLn(lastRecNo);
          if lastRecNo > 0 then
            begin
              if not readEventLog(hEventLog,EVENTLOG_SEQUENTIAL_READ or
                                            EVENTLOG_BACKWARDS_READ,lastRecNo,@event,0,byteCount,minByteCount) then
                if GetLastError = ERROR_INSUFFICIENT_BUFFER then
                  begin
                    GetMem(pEvent,minByteCount);
                    if readEventLog(hEventLog,EVENTLOG_SEQUENTIAL_READ or
                                              EVENTLOG_BACKWARDS_READ,0,pEvent,minByteCount,byteCount,minByteCount) then
                      begin
                        WriteLn(pEvent^.eventID);
                        WriteLn(pEvent^.eventType);
                      end
                    else
                      WriteLn(GetLastError);
                    FreeMem(pEvent);
                  end;
            end;
          closeEventLog(hEventLog);
        end
      else
        closeEventLog(hEventLog);
    end;
end;
Die eventLogList ist so definiert:
 eventLogList : Array of TEventLog; und wird so befüllt:
Delphi-Quellcode:
function TThreadMonEventLog.getNumEventLogs:Byte;
const
  HKEY_LOCAL_MACHINE = $80000002;
var
  reg : TRegistry;
  i : Byte;
  nameList : TStringList;
begin
  result:=0;
  reg := TRegistry.Create;
  nameList := TStringList.Create;
  reg.RootKey:=HKEY_LOCAL_MACHINE;
  if reg.OpenKeyReadOnly('SYSTEM\CurrentControlSet\Services\EventLog') then
    begin
      reg.GetKeyNames(nameList);
      result:=nameList.count;
      setLength(eventLogList,result);
      for i:=0 to nameList.count -1 do
        begin
          eventLogList[i].name := nameList[i];
        end;
      nameList.Free;
    end;
  reg.CloseKey;
  reg.Free;
end;
Ich würde mich freuen, wenn jemand einen Rat für mich hätte.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: fehlerhafte/merkwürdige EventID beim Auslesen des EventL

  Alt 13. Jul 2009, 19:33
Moin Klaus,

statt GetMem könntest Du es mal mit AllocMem versuchen, da letzteres den reservierten Speicherbereich auf 0 initialisiert.
Wenn Du Dir mal 3221356552 in Binärdarstellung anschaust, wirst Du feststellen, dass am Ende auch eine 8 steht.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: fehlerhafte/merkwürdige EventID beim Auslesen des EventL

  Alt 13. Jul 2009, 20:06
Hallo Christian,

danke für Deine schnelle Antwort.
Da muss man erst einmal drauf kommen sich das Binär anzuschauen ..

Gelöst habe ich es nun so:
pEvent^.eventID:=pEvent^.eventID and $0000FFFF; -> Link

Nochmals danke!

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#4

Re: fehlerhafte/merkwürdige EventID beim Auslesen des EventL

  Alt 13. Jul 2009, 20:26
Solche Strukturen sind IMMER mit Nullen vorzubefüllen weil Windows in vielen Fällen nur dort reinschreibt wo es notwendig ist. Das von Dir benutzte Maskieren wird früher oder später wieder andere Probleme mit sich bringen. Machs lieber gleich richtig.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: fehlerhafte/merkwürdige EventID beim Auslesen des EventL

  Alt 13. Jul 2009, 20:45
Zitat von OldGrumpy:
Solche Strukturen sind IMMER mit Nullen vorzubefüllen weil Windows in vielen Fällen nur dort reinschreibt wo es notwendig ist. Das von Dir benutzte Maskieren wird früher oder später wieder andere Probleme mit sich bringen. Machs lieber gleich richtig.
Hallo OldGrumpy,

der Speicher wird nun mit Nullen vorbefüllt (ich verwende jetzt AllocMem)
das hat aber nicht zur Lösung des Problems beigetragen.

Wenn Du dir den Link in meinem letzen Post anschaust
wirst Du sehen, dass der eigentliche CodeStatus (der für mich
interessant ist) in den letzen 16bit der eventID steht.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz