![]() |
fehlerhafte/merkwürdige EventID beim Auslesen des EventLog
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 ![]()
Code:
In Delphi habe ich das so umgesetzt:
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;
Delphi-Quellcode:
Das Auslesen mache ich mit diesem Code:
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;
Delphi-Quellcode:
Die eventLogList ist so definiert:
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;
Delphi-Quellcode:
und wird so befüllt:
eventLogList : Array of TEventLog;
Delphi-Quellcode:
Ich würde mich freuen, wenn jemand einen Rat für mich hätte.
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; Grüße Klaus |
Re: fehlerhafte/merkwürdige EventID beim Auslesen des EventL
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. |
Re: fehlerhafte/merkwürdige EventID beim Auslesen des EventL
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:
Delphi-Quellcode:
->
pEvent^.eventID:=pEvent^.eventID and $0000FFFF;
![]() Nochmals danke! Grüße Klaus |
Re: fehlerhafte/merkwürdige EventID beim Auslesen des EventL
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.
|
Re: fehlerhafte/merkwürdige EventID beim Auslesen des EventL
Zitat:
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 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