Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2013, 14:40   #1
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
Злость C++ Чтение событий из Windows Event Log + парсинг

Есть винда, есть некое событие, которое отписывается в журнал событий винды. Хочется получить содержимое, которое можно увидеть запустив "Просмотр событий" в администрировании, счёлкнуть на событие и внизу во вкладке "общее" будет что-то типо:
Цитата:
Имя сбойного приложения: windows_event_log.exe, версия: 0.0.0.0, отметка времени: 0x525b8b60
Имя сбойного модуля: msvcrt.dll, версия: 7.0.7601.17744, отметка времени 0x4eeaf722
Код исключения: 0xc0000005
Смещение ошибки: 0x00021461
Идентификатор сбойного процесса: 0x548
Время запуска сбойного приложения: 0x01cec8a467f62afa
Путь сбойного приложения: C:\Users\_KUL\Desktop\Qt test\build-windows_event_log-Desktop_Qt_5_1_0_MinGW_32bit\debug\ windows_event_log.exe
Путь сбойного модуля: C:\Windows\syswow64\msvcrt.dll
Код отчета: a64212c9-3497-11e3-b4e9-001fd0802a2e
И вот это хочется в стринг загнать, чтобы потом парсить.
Имею:
Код:
#include <QCoreApplication>
#include "windows.h"
#include "winbase.h"
#include <iostream>
#include <ctime>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    HANDLE h;
    EVENTLOGRECORD *pevlr;
    BYTE bBuffer[16384];
    DWORD dwRead, dwNeeded, cRecords, dwThisRecord;
 
    h = OpenEventLog( 0, L"Application");
    if (h == NULL) std::cout << "Error open EventLog\n";
    pevlr = (EVENTLOGRECORD *) &bBuffer;
    GetOldestEventLogRecord(h, &dwThisRecord);
    time_t myt;
    while (ReadEventLog(h,
                    EVENTLOG_FORWARDS_READ |
                    EVENTLOG_SEQUENTIAL_READ,
                    0,
                    pevlr,
                    16384,
                    &dwRead,
                    &dwNeeded))
        {
            while (dwRead > 0)
            {
                myt = pevlr->TimeGenerated;
                std::cout << ctime(&myt);
 
             //Вот тут не хватает мозгов, чтобы из pevlr достать содержимое события.
 
                dwRead -= pevlr->Length;
                pevlr = (EVENTLOGRECORD *) ((LPBYTE) pevlr + pevlr->Length);
            }
            pevlr = (EVENTLOGRECORD *) &bBuffer;
        }
    return a.exec();
}

Глядение на http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx пока не помогает ...

Такое ощущение, что pevlr->DataOffset хранит количество байт того самого, нужного текста. Вот только понять бы, за каким адресом указатель чара зафиксировать, чтобы по байтно считать данную инфу? ...
_KUL вне форума Ответить с цитированием
Старый 14.10.2013, 14:49   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Скорее всего:
((LPBYTE) pevlr + pevlr->DataOffset);

Аналогично и для StringOffset
waleri вне форума Ответить с цитированием
Старый 15.10.2013, 02:13   #3
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Это адрес от куда начать читать "pevlr->DataOffset"?
_KUL вне форума Ответить с цитированием
Старый 15.10.2013, 09:06   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Это адрес, где находятся данные, на которые ссылается DataOffset.
waleri вне форума Ответить с цитированием
Старый 15.10.2013, 10:03   #5
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Как-то так?
char * mychar = (char*)((LPBYTE) pevlr + pevlr->StringOffset);
std::cout << mychar << std::endl;
не работает ...
_KUL вне форума Ответить с цитированием
Старый 15.10.2013, 11:13   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Вполне возможно, что wchar_t.
Кроме того, надо смотреть на NumStrings - не у каждого события же есть тексты.
waleri вне форума Ответить с цитированием
Старый 15.10.2013, 11:56   #7
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Какая-то каша получается ...
Сделал:
if (pevlr->DataLength > 0) {
wchar_t * mychar = (wchar_t*)(pevlr + pevlr->DataOffset);
std::cout << mychar << std::endl;
}

Получаю, например такое - "- Code: CORSVCC00000773- Call: CORSVCC00000755- PID: 00002404-TID: 00003552- CMD: C:\Windows\system32\vssvc.exe - User: Name: NT AUTHORITY\"

А если через "просмотр событий посмотреть", то там текст "Служба VSS выключается из-за тайм-аута простоя. ". В принципе логика то прослеживается, но вот содержимое то ппц не то совсем ). И при чём, это сообщение одно из последний вывелось, НО в логах ещё пару десятков есть, которые под условие не попали почему то ... А у большинства других, вообще такое содержимое - "{A92DAB39-4E2C-4304-9AB6BC44E68B55E2}0000d1e75139080e65 4e30d044b2bf40415900000904" как будто какое-то значение реестра ...
_KUL вне форума Ответить с цитированием
Старый 15.10.2013, 12:02   #8
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Едрит копать ... Это ключи софтин, с которыми произошли события ... Это нужно парсить выводы (wchar_t*)(pevlr + pevlr->DataOffset), потом лезть в реестр, смотреть что это за приложение глюкнуло?! MS не могли ещё сложнее придумать писать логи? ппц ...
Но вот вопрос, как же само содержимое, которое в "просмотр событий" так лаконично отображается в окне "Общие", получить то? ;(
_KUL вне форума Ответить с цитированием
Старый 15.10.2013, 16:00   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Эти данные могут быть все что угодно, в смысле необязательно ключи реестра.
У каждого события есть источник и код. По этому коду из этого источника вытаскивается ТЕКСТ ошибки. Далее, в этом тексте могут быть аргументы типа %1, %2, %3 и так далее, на место которых подставляются строчки из StringOffset. В конце пишется свободный текст, тот самый из DataOffset. Нигде нет гарантии, что эти данные будут вообще текстом, хотя обычно они тоже текст.

Посмотрите функцию ReportEvent()
waleri вне форума Ответить с цитированием
Старый 29.04.2014, 19:28   #10
qqrm
Новичок
Джуниор
 
Регистрация: 23.09.2012
Сообщений: 2
По умолчанию

Удалось ли?
qqrm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг логов Xorg.*.log FLEXO_187 Помощь студентам 0 25.09.2013 20:01
Журнал событий Windows HyperZen Общие вопросы Delphi 6 16.05.2011 11:04
Чтение "Просмотр событий" W0LF Общие вопросы Delphi 1 08.05.2010 23:12
Что мне выдает event log в Delphi 2009 ? Polotenchik Общие вопросы Delphi 4 03.07.2009 17:52
Эмуляция событий в Windows skeletishe Общие вопросы Delphi 1 26.03.2009 17:58