Чтение журнала событий Windows

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Чтение журнала событий Windows

Сообщение ru_alex »

Всем привет!

Помогите плиз разобраться. Надобно прочитать данные оттуда. Даты для начала.
Попробовал сваять:

Код: Выделить всё

  MODULE('Advapi32.dll')

    OpenEventLog(*CSTRING,*CSTRING),HANDLE,PASCAL,RAW,NAME('OpenEventLogA')
    CloseEventLog(HANDLE),BOOL,PROC,PASCAL,RAW
    ReadEventLog(HANDLE,DWORD,DWORD,*STRING,DWORD,*DWORD,*DWORD),BOOL,PASCAL,NAME('ReadEventLogA')
    !ReadEventLog(HANDLE,DWORD,DWORD,*BYTE[],DWORD,*DWORD,*DWORD),BOOL,PASCAL,NAME('ReadEventLogA')

  END

....

EVENTLOGRECORD    GROUP,TYPE
Length              DWORD
Reserved            DWORD
RecordNumber        DWORD
TimeGenerated       DWORD
TimeWritten         DWORD
EventID             DWORD
EventType           WORD
NumStrings          WORD
EventCategory       WORD
ReservedFlags       WORD
ClosingRecordNumber DWORD
StringOffset        DWORD
UserSidLength       DWORD
UserSidOffset       DWORD
DataLength          DWORD
DataOffset          DWORD
                  END

EVENTLOG_SEQUENTIAL_READ     EQUATE(0001h)
EVENTLOG_SEEK_READ           EQUATE(0002h)
EVENTLOG_FORWARDS_READ       EQUATE(0004h)
EVENTLOG_BACKWARDS_READ      EQUATE(0008h)

ERROR_INSUFFICIENT_BUFFER    EQUATE(07Ah)
ERROR_HANDLE_EOF             EQUATE(026h)

....

hEventLog              HANDLE
status                 DWORD
dwBytesToRead          DWORD
dwBytesRead            DWORD
dwMinimumBytesToRead   DWORD
pBuffer                &STRING
LOC:ServerName           CSTRING(60)
LOC:SourceName           CSTRING(60)
  
....

   LOC:ServerName = ''
   LOC:SourceName = 'Application'
   hEventLog = OpenEventLog(LOC:ServerName, LOC:SourceName)
   if hEventLog
     !dwBytesToRead = 64
     !dwBytesToRead = size(EVENTLOGRECORD)
     dwBytesToRead = 10000h
     pBuffer &= new(string(dwBytesToRead))
     if ~(pBuffer &= null)
          if ReadEventLog(hEventLog, |
              EVENTLOG_SEEK_READ + EVENTLOG_BACKWARDS_READ, |
              1, pBuffer, dwBytesToRead, dwBytesRead, dwMinimumBytesToRead) = 0
            status = GetLastError();
            if ERROR_INSUFFICIENT_BUFFER = status
              stop('ERROR_INSUFFICIENT_BUFFER')


!                  status = ERROR_SUCCESS;
!  
!                  pTemp = (PBYTE)realloc(pBuffer, dwMinimumBytesToRead);
!                  if (NULL == pTemp)
!                  {
!                      wprintf(L"Failed to reallocate the memory for the record buffer (%d bytes).\n", dwMinimumBytesToRead);
!                      goto cleanup;
!                  }
!  
!                  pBuffer = pTemp;
!                  dwBytesToRead = dwMinimumBytesToRead;
            else
              if ERROR_HANDLE_EOF <> status
                stop('ERROR   '&status)
!                      wprintf(L"ReadEventLog failed with %lu.\n", status);
!                      goto cleanup;
              else
                stop('ERROR_INSUFFICIENT_BUFFER')
              end
            end
          else
            stop(pBuffer[1:255])
            !  // Print the contents of each record in the buffer.
            !  DumpRecordsInBuffer(pBuffer, dwBytesRead);
          end


       clear(pBuffer)
       dispose(pBuffer)
     else
       stop('pBuffer is null')
     end
     CloseEventLog(handleLog#)
   else
     stop('OpenEventLog filed   '&GetLastError())
   end

ReadEventLog выдает ошибку 1783, нашел описание в инете:

RPC_X_BAD_STUB_DATA 1783 (0x6F7)
The stub received bad data.

вроде как связана с неправильной передачей параметров. Дальше продвинуться не смог. Пробовал передавать и CSTRING и BYTE[], результат тот же.
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Чтение журнала событий Windows

Сообщение ru_alex »

Эх. лето. Никто программить видно не хотит :).
Разобрался с этим, надо просто внимательнее документацию читать.
Вот, может кому пригодится:
(чтение последних записей журнала ошибок приложений Windows, если надобно другой журнал, там легко изменить)

Описание структур, констант и прототипов WinApi:

Код: Выделить всё

DWORD                   EQUATE(ULONG)
WORD                    EQUATE(SIGNED)

EVENTLOGRECORD    GROUP,TYPE
Length              DWORD
Reserved            DWORD
RecordNumber        DWORD
TimeGenerated       DWORD
TimeWritten         DWORD
EventID             DWORD
EventType           WORD
NumStrings          WORD
EventCategory       WORD
ReservedFlags       WORD
ClosingRecordNumber DWORD
StringOffset        DWORD
UserSidLength       DWORD
UserSidOffset       DWORD
DataLength          DWORD
DataOffset          DWORD
                  END

EVENTLOG_SEQUENTIAL_READ     EQUATE(0001h)
EVENTLOG_SEEK_READ           EQUATE(0002h)
EVENTLOG_FORWARDS_READ       EQUATE(0004h)
EVENTLOG_BACKWARDS_READ      EQUATE(0008h)

ERROR_INSUFFICIENT_BUFFER    EQUATE(07Ah)
ERROR_HANDLE_EOF             EQUATE(026h)

MAP
  MODULE('Advapi32.dll')
    OpenEventLog(*CSTRING,*CSTRING),HANDLE,PASCAL,RAW,NAME('OpenEventLogA')
    CloseEventLog(HANDLE),BOOL,PROC,PASCAL,RAW
    ReadEventLog(HANDLE,DWORD,DWORD,DWORD,DWORD,*DWORD,*DWORD),BOOL,PASCAL,NAME('ReadEventLogA')
  END
END
Переменные:

Код: Выделить всё

LOC:ServerName           CSTRING(60)
LOC:SourceName           CSTRING(60)
hEventLog              HANDLE
status                 DWORD
dwBytesToRead          DWORD
dwBytesRead            DWORD
dwMinimumBytesToRead   DWORD
pBuffer                &STRING
EVENTLOGREC            GROUP(EVENTLOGRECORD)
                       END
OverStrEVENTLOGREC     STRING(SIZE(EVENTLOGREC)),OVER(EVENTLOGREC)
Код:

Код: Выделить всё

   !'', 'Application', 'Security', 'System'
   LOC:SourceName = 'Application'
   LOC:ServerName = ''
   hEventLog = OpenEventLog(LOC:ServerName, LOC:SourceName)
   if hEventLog
     dwBytesToRead = 10000h
     pBuffer &= new(string(dwBytesToRead))
     if ~(pBuffer &= null)
       if ReadEventLog(hEventLog, |
           EVENTLOG_SEQUENTIAL_READ + EVENTLOG_BACKWARDS_READ, |
           1, address(pBuffer), dwBytesToRead, dwBytesRead, dwMinimumBytesToRead) = 0
         status = GetLastError();
         if ERROR_INSUFFICIENT_BUFFER = status
!            тут забил пока обрабатывать
!           stop('ERROR_INSUFFICIENT_BUFFER   '&GetLastError())
!
!
!                  status = ERROR_SUCCESS;
!  
!                  pTemp = (PBYTE)realloc(pBuffer, dwMinimumBytesToRead);
!                  if (NULL == pTemp)
!                  {
!                      wprintf(L"Failed to reallocate the memory for the record buffer (%d bytes).\n", dwMinimumBytesToRead);
!                      goto cleanup;
!                  }
!  
!                  pBuffer = pTemp;
!                  dwBytesToRead = dwMinimumBytesToRead;
!         else
!           if ERROR_HANDLE_EOF <> status
!             stop('ERROR   '&status)
!                      wprintf(L"ReadEventLog failed with %lu.\n", status);
!                      goto cleanup;
!           else
!             stop('ERROR_INSUFFICIENT_BUFFER')
!           end
         end
       else
         b# = 1
         loop
           clear(EVENTLOGREC)
           OverStrEVENTLOGREC = pBuffer[b# : (b# + size(EVENTLOGREC) - 1)]
           dat# = date(1, 1, 1970) + int(EVENTLOGREC.TimeGenerated / (24*60*60))
           tim# = (EVENTLOGREC.TimeGenerated % (24*60*60)) * 100

           !stop(format(dat#, @d6-)&'  '&format(tim#, @t1))

           b# += EVENTLOGREC.Length
           if b# >= dwBytesRead then break.
         end
       end
       clear(pBuffer)
       dispose(pBuffer)
     end
     CloseEventLog(handleLog#)
   end
Ответить