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 fehlerhafte/merkwürdige EventID beim Auslesen des EventLog (https://www.delphipraxis.net/137063-fehlerhafte-merkwuerdige-eventid-beim-auslesen-des-eventlog.html)

Klaus01 13. Jul 2009 17:46


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 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:
Delphi-Quellcode:
 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

Christian Seehase 13. Jul 2009 18:33

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.

Klaus01 13. Jul 2009 19:06

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;
-> Link

Nochmals danke!

Grüße
Klaus

OldGrumpy 13. Jul 2009 19:26

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.

Klaus01 13. Jul 2009 19:45

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

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 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