#include "stdafx.h" // #include "winbase.h" #define MAX_INSERT_STRS 5 TCHAR *aszTSEventSources[] = { _T("TermService"), _T("TermDD"), _T("TermServDevices") }; BOOL ExtractEvents(); BOOL ExtractAllTSEvents() { cout << endl; return ExtractEvents (); } BOOL ExtractEvents () { USES_CONVERSION; BOOL bFoundEvents = FALSE; HANDLE hEventLog = OpenEventLog(NULL, _T("System")); if (hEventLog) { const DWORD dwBytesToRead = 1024*10; char *pBuff = new char[dwBytesToRead]; if (pBuff) { DWORD dwBytesRead, dwBytesNeeded; while (ReadEventLog(hEventLog, EVENTLOG_BACKWARDS_READ | EVENTLOG_SEQUENTIAL_READ, 0, PVOID(pBuff), dwBytesToRead, &dwBytesRead, &dwBytesNeeded)) { if (dwBytesRead == 0) break; for (PEVENTLOGRECORD pEventLogRecord = ( PEVENTLOGRECORD ) pBuff; PCHAR(pEventLogRecord) + pEventLogRecord->Length < pBuff + dwBytesRead; pEventLogRecord = (EVENTLOGRECORD *)(PCHAR(pEventLogRecord) + pEventLogRecord->Length) ) { LPCTSTR szSource = LPCTSTR(PBYTE(pEventLogRecord) + sizeof(EVENTLOGRECORD)); // // check if event source is among interesting ones. // LPCTSTR szEventSource = NULL; for (int i = 0; i < (sizeof(aszTSEventSources) / sizeof(aszTSEventSources[0])); i++) { if (_tcsicmp(szSource, aszTSEventSources[i]) == 0) szEventSource = aszTSEventSources[i]; } if (!szEventSource) continue; // // prepare the array of insert strings for FormatMessage - the // insert strings are in the log entry. // char *aInsertStrings[MAX_INSERT_STRS]; char *p = (char *) ((LPBYTE) pEventLogRecord + pEventLogRecord->StringOffset); for (i = 0; i < pEventLogRecord->NumStrings && i < MAX_INSERT_STRS; i++) { aInsertStrings[i] = p; p += strlen(p) + 1; // point to next string } // // Get the binaries to look message in from registry. // TCHAR szSourceKey[1024]; _tcscpy(szSourceKey, _T("SYSTEM\\CurrentControlSet\\Services\\EventLog\\System\\")); _tcscat(szSourceKey, szEventSource); CRegistry oReg; TCHAR szSourcePath[MAX_PATH]; if (oReg.OpenKey(HKEY_LOCAL_MACHINE, szSourceKey, KEY_READ) == ERROR_SUCCESS) { LPTSTR str; DWORD dwSize; if (ERROR_SUCCESS == oReg.ReadRegString(_T("EventMessageFile"), &str, &dwSize)) { ExpandEnvironmentStrings(str, szSourcePath, MAX_PATH); } else { cout << " Error Reading Registry (" << T2A(szSourceKey) << ")/(EventMessageFiles)" << endl; continue; } } else { cout << " Error Reading Registry (" << T2A(szSourceKey) << endl; continue; } // // Binary String in registry could contain multipal binaries seperated by ; // TCHAR *szModule; szModule = _tcstok(szSourcePath, _T(";")); // // for each binary found // DWORD dwBytesTransfered = 0; do { HINSTANCE hModule = LoadLibrary(szModule); TCHAR szMessage[1024]; dwBytesTransfered = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY, hModule, pEventLogRecord->EventID, 0, szMessage, 1024, (va_list *)aInsertStrings); if (dwBytesTransfered) { bFoundEvents = TRUE; TCHAR szTimeString[512]; time_t timeGenerated = pEventLogRecord->TimeGenerated; _tcsftime(szTimeString, 512, _T("%c"), localtime( (const time_t *)&timeGenerated )); cout << " " << T2A(szTimeString) << ": ( " << T2A(szEventSource) << " ) : " << T2A(szMessage); } else { cout << " FormatMessage Failed. lasterror = " << GetLastError() << endl; } szModule = _tcstok(NULL, _T(";")); } while (!dwBytesTransfered && szModule); } } } } else { cout << " Failed to Open Event log." << endl; return FALSE; } return bFoundEvents; }