GetNumberOfEventLogRecords возвращает неверное количество журналов событий

У меня есть этот код C ++ для чтения записей журнала событий

DWORD GetLogRecords(LPCWSTR wsLogFile)
{
HANDLE hEvt = OpenEventLog(NULL, wsLogFile);
if (hEvt==NULL) return 0;

DWORD dwTotalRecords;
BOOL res = GetNumberOfEventLogRecords(hEvt, &dwTotalRecords);
CloseEventLog(hEvt);

return (res != 0) ? dwTotalRecords : 0;
}

Результат

atlTraceGeneral - C:\Windows\system32\winevt\logs\ACEEventLog.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Application.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\ConnectionInfo.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Error.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\HardwareEvents.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Internet Explorer.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Key Management Service.evtx - 23499 Total Records
...

Я вызвал эту функцию, указав полный путь ко всем файлам журнала .EVTX на моем компьютере (150 файлов журнала). И каждый раз возвращается 23499! Мои файлы журналов имеют разные размеры и около 0, почему я всегда получаю 23499?

ОБНОВЛЕНИЕ 2: После того как я очистил журналы приложений, теперь я получаю 0 для всех файлов журналов .evtx. Я думаю, что он всегда получает журнал приложения вместо указанного файла .evtx.

ОБНОВЛЕНИЕ: Как предложил Реми Лебо, но результат все тот же.

-1

Решение

В интересах других, решение этой проблемы заключается в том, что OpenEventLog не принимает путь Вместо этого вы должны дать ему имя источника журнала событий (что-то вроде "HardwareEvents").

Если вы позвоните OpenEventLog с неверным именем источника (которое включает в себя предоставление пути к файлу), тогда, как задокументировано, он откроет Application войти вместо:

Если вы указываете собственный журнал, и он не может быть найден, журнал событий
Сервис открывает журнал приложений.

2

Другие решения

Вы не проверяете результат GetNumberOfEventLogRecords() за ошибку. И вы протекаете ручку журнала. Попробуйте это вместо этого:

DWORD GetLogRecords(LPCWSTR wsLogFile)
{
HANDLE hEvt = OpenEventLog(NULL, wsLogFile);
if (hEvt==NULL) return 0;

DWORD dwTotalRecords;
BOOL res = GetNumberOfEventLogRecords(hEvt, &dwTotalRecords);
CloseEventLog(hEvt);

return (res != 0) ? dwTotalRecords : 0;
}
1

По вопросам рекламы [email protected]