WindowsXP-SP1/termsrv/setup/tstst/event.cpp
2020-09-30 16:53:49 +02:00

178 lines
6.0 KiB
C++

#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;
}