diff options
Diffstat (limited to 'private/eventlog/test/testwin.c')
-rw-r--r-- | private/eventlog/test/testwin.c | 770 |
1 files changed, 770 insertions, 0 deletions
diff --git a/private/eventlog/test/testwin.c b/private/eventlog/test/testwin.c new file mode 100644 index 000000000..bea524159 --- /dev/null +++ b/private/eventlog/test/testwin.c @@ -0,0 +1,770 @@ +/*++ + +Copyright (c) 1990 Microsoft Corporation + +Module Name: + + TESTWIN.C + +Abstract: + + Test program for the eventlog service. This program calls the Win + APIs to test out the operation of the service. + +Author: + + Rajen Shah (rajens) 05-Aug-1991 + +Revision History: + + +--*/ +/*----------------------*/ +/* INCLUDES */ +/*----------------------*/ +#include <nt.h> +#include <ntrtl.h> +#include <nturtl.h> +#include <stdio.h> // printf +#include <string.h> // stricmp +#include <stdlib.h> +#include <windows.h> +#include <netevent.h> + +// +// Turn on NotifyChangeEventLog +// +#define TEST_NOTIFY 1 +//#define TEST_REMOTE 1 + +#define READ_BUFFER_SIZE 1024*2 // Use 2K buffer + +#define SIZE_DATA_ARRAY 65 + +// +// Global buffer used to emulate "binary data" when writing an event +// record. +// + DWORD Data[SIZE_DATA_ARRAY]; +// LPWSTR ServerName=L"\\\\danl2"; + LPWSTR ServerName=NULL; + + +VOID +Initialize ( + VOID + ) +{ + DWORD i; + + // Initialize the values in the data buffer. + // + for (i=0; i< SIZE_DATA_ARRAY; i++) + Data[i] = i; + +} + + +BOOL +Usage ( + VOID + ) +{ + printf( "usage: \n" ); + printf( "-b <filename> Tests BackupEventLog API\n"); + printf( "-c Tests ClearEventLog API\n"); + printf( "-n Tests NotifyChangeEventlog\n"); + printf( "-rsb Reads event log sequentially backwards\n"); + printf( "-rsf Reads event log sequentially forwards\n"); + printf( "-rrb <record> Reads event log from <record> backwards\n"); + printf( "-rrf <record> Reads event log from <record> forwards\n"); + printf( "-w <count> Tests ReportEvent API <count> times\n"); + return ERROR_INVALID_PARAMETER; + +} // Usage + + + +BOOL +WriteLogEntry ( HANDLE LogHandle, DWORD EventID ) + +{ +#define NUM_STRINGS 2 + + BOOL Status; + WORD EventType, i; + DWORD DataSize; + PSID pUserSid; + + PWSTR Strings[NUM_STRINGS] = {L"StringAOne", + L"StringATwo" + }; + + EventType = EVENTLOG_INFORMATION_TYPE; + pUserSid = NULL; + DataSize = sizeof(DWORD) * SIZE_DATA_ARRAY; + + for (i=0; i< SIZE_DATA_ARRAY; i++) + Data[i] += i; + + Status = ReportEventW ( + LogHandle, + EventType, + 0, // event category + EventID, + pUserSid, + NUM_STRINGS, + DataSize, + Strings, + (PVOID)Data + ); + + return (Status); +} + +DWORD +WriteLogEntryMsg ( HANDLE LogHandle, DWORD EventID ) +/* + This function requires a registry entry in the Applications section + of the Eventlog for TESTWINAPP, it will use the netevent.dll message file. +*/ + +{ +#define NUM_STRINGS 2 + + WORD EventType; + DWORD DataSize; + PSID pUserSid; + + PWSTR Strings[NUM_STRINGS]; + + Strings[0] = L"This is a BOGUS message for TEST purposes Ignore this substitution text"; + Strings[1] = L"GHOST SERVICE in the long string format - I wanted a long string to pass into this function"; + + EventType = EVENTLOG_INFORMATION_TYPE; + pUserSid = NULL; + DataSize = sizeof(DWORD) * SIZE_DATA_ARRAY; + + + if (!ReportEventW ( + LogHandle, + EventType, + 0, // event category + EVENT_SERVICE_START_FAILED_NONE, + pUserSid, + NUM_STRINGS, + 0, // DataSize + Strings, + (PVOID)NULL // Data + )) { + + printf("ReportEventW failed %d\n",GetLastError()); + return(GetLastError()); + } + return (NO_ERROR); +} + + +VOID +DisplayEventRecords( PVOID Buffer, + DWORD BufSize, + ULONG *NumRecords) + +{ + PEVENTLOGRECORD pLogRecord; + ANSI_STRING StringA; + UNICODE_STRING StringU; + PWSTR pwString; + DWORD Count = 0; + DWORD Offset = 0; + DWORD i; + + pLogRecord = (PEVENTLOGRECORD) Buffer; + + while ((DWORD)Offset < BufSize) { + + printf("\nRecord # %lu\n", ++Count); + + printf("Length: 0x%lx TimeGenerated: 0x%lx EventID: 0x%lx EventType: 0x%x\n", + pLogRecord->Length, pLogRecord->TimeGenerated, pLogRecord->EventID, + pLogRecord->EventType); + + printf("NumStrings: 0x%x StringOffset: 0x%lx UserSidLength: 0x%lx TimeWritten: 0x%lx\n", + pLogRecord->NumStrings, pLogRecord->StringOffset, + pLogRecord->UserSidLength, pLogRecord->TimeWritten); + + printf("UserSidOffset: 0x%lx DataLength: 0x%lx DataOffset: 0x%lx \n", + pLogRecord->UserSidOffset, pLogRecord->DataLength, + pLogRecord->DataOffset); + + // + // Print out module name + // + pwString = (PWSTR)((DWORD)pLogRecord + sizeof(EVENTLOGRECORD)); + RtlInitUnicodeString (&StringU, pwString); + RtlUnicodeStringToAnsiString (&StringA, &StringU, TRUE); + + printf("ModuleName: %s ", StringA.Buffer); + RtlFreeAnsiString (&StringA); + + // + // Display ComputerName + // + pwString = pwString + (wcslen(pwString) + 1); + + RtlInitUnicodeString (&StringU, pwString); + RtlUnicodeStringToAnsiString (&StringA, &StringU, TRUE); + + printf("ComputerName: %s\n",StringA.Buffer); + RtlFreeAnsiString (&StringA); + + // + // Display strings + // + pwString = (PWSTR)((DWORD)Buffer + pLogRecord->StringOffset); + + printf("\nStrings: \n"); + for (i=0; i<pLogRecord->NumStrings; i++) { + + RtlInitUnicodeString (&StringU, pwString); + RtlUnicodeStringToAnsiString (&StringA, &StringU, TRUE); + + printf(" %s \n",StringA.Buffer); + + RtlFreeAnsiString (&StringA); + + pwString = (PWSTR)((DWORD)pwString + StringU.MaximumLength); + } + + // Get next record + // + Offset += pLogRecord->Length; + + pLogRecord = (PEVENTLOGRECORD)((DWORD)Buffer + Offset); + + } + *NumRecords = Count; + +} + + +BOOL +ReadFromLog ( HANDLE LogHandle, + PVOID Buffer, + ULONG *pBytesRead, + DWORD ReadFlag, + DWORD Record + ) +{ + BOOL Status; + DWORD MinBytesNeeded; + DWORD ErrorCode; + + Status = ReadEventLogW ( + LogHandle, + ReadFlag, + Record, + Buffer, + READ_BUFFER_SIZE, + pBytesRead, + &MinBytesNeeded + ); + + + if (!Status) { + ErrorCode = GetLastError(); + if (ErrorCode == ERROR_HANDLE_EOF) { + Status = TRUE; + } + else if (ErrorCode == ERROR_NO_MORE_FILES) { + printf("Buffer too small. Need %lu bytes min\n", MinBytesNeeded); + } + else { + printf("Error from ReadEventLog %d \n", ErrorCode); + } + + } + + return (Status); +} + + + + +BOOL +TestReadEventLog (DWORD Count, DWORD ReadFlag, DWORD Record) + +{ + BOOL bStatus,IStatus; + DWORD status; + HANDLE LogHandle; + LPWSTR ModuleName; + DWORD NumRecords, BytesReturned; + PVOID Buffer; + DWORD RecordOffset; + DWORD NumberOfRecords; + DWORD OldestRecord; + + printf("Testing ReadEventLog API to read %lu entries\n",Count); + + Buffer = malloc (READ_BUFFER_SIZE); + + // + // Initialize the strings + // + NumRecords = Count; + ModuleName = L"TESTWINAPP"; + + // + // Open the log handle + // + printf("OpenEventLog - "); + LogHandle = OpenEventLogW ( + ServerName, + ModuleName + ); + + if (LogHandle == NULL) { + printf("Error - %d\n", GetLastError()); + + } else { + printf("SUCCESS\n"); + + // + // Get and print record information + // + + bStatus = GetNumberOfEventLogRecords(LogHandle, & NumberOfRecords); + if (bStatus) { + bStatus = GetOldestEventLogRecord(LogHandle, & OldestRecord); + } + + if (!bStatus) { + printf("Query of record information failed with %X", GetLastError()); + return(bStatus); + } + + printf("\nThere are %d records in the file, %d is the oldest" + " record number\n", NumberOfRecords, OldestRecord); + + RecordOffset = Record; + + printf("Reading %u records\r", Count); + + while (Count) { + + // + // Read from the log + // + bStatus = ReadFromLog ( LogHandle, + Buffer, + &BytesReturned, + ReadFlag, + RecordOffset + ); + if (bStatus) { + printf("Bytes read = 0x%lx\n", BytesReturned); + printf("Read %u records\n", NumRecords); + DisplayEventRecords(Buffer, BytesReturned, &NumRecords); + Count -= NumRecords; + RecordOffset += NumRecords; + } else { + break; + } + + if (BytesReturned == 0) + break; + } + printf("\n"); + + if (!bStatus) { + printf ("ReadFromLog Error - %d. Remaining count %lu\n", GetLastError(), + Count); + } else { + printf ("SUCCESS\n"); + } + + printf("Calling CloseEventLog\n"); + IStatus = CloseEventLog (LogHandle); + } + + return (bStatus); +} + + + +BOOL +TestWriteEventLog (DWORD Count) + +{ + DWORD Status=NO_ERROR; + BOOL IStatus; + HANDLE LogHandle; + LPWSTR ModuleName; + DWORD EventID = 99; + DWORD WriteCount; + DWORD DataNum=0; + + printf("Testing ReportEvent API\n"); + + // + // Initialize the strings + // + ModuleName = L"TESTWINAPP"; + + printf("Calling RegisterEventSource for WRITE %lu times\n", Count); + while ((Count > 0) && (Status== NO_ERROR)) { + // + // Open the log handle + // + LogHandle = RegisterEventSourceW ( + ServerName, + ModuleName + ); + + if (LogHandle == NULL) { + Status = GetLastError(); + printf("RegisterEventSource Failure - %d\n", Status); + return(Status); + + } else { + printf("Registered - "); + WriteCount = 5; + printf("Record # %u: ", Count); + + while ((WriteCount>0) && (Status==NO_ERROR)) { + + // + // Write an entry into the log + // + Data[0] = DataNum; // Make data "unique" + EventID = (EventID + DataNum) % 100; // Vary the eventids + Status = WriteLogEntryMsg( LogHandle, EventID ); + DataNum++; + WriteCount--; + + if (Status != NO_ERROR) { + printf ("WriteLogEntry Error - %d. Remaining count %lu\n",Status,Count); + } else { + printf ("%d,",WriteCount); + } + } + + IStatus = DeregisterEventSource (LogHandle); + printf(" - Deregistered\n"); + } + Count--; + } + + printf("\n"); + return (Status); +} + + + +BOOL +TestClearLogFile () + +{ + BOOL Status, IStatus; + HANDLE LogHandle; + LPWSTR ModuleName, BackupName; + + printf("Testing ClearLogFile API\n"); + // + // Initialize the strings + // + ModuleName = L"TESTWINAPP"; + + // + // Open the log handle + // + printf("Calling OpenEventLog for CLEAR - "); + LogHandle = OpenEventLogW ( + NULL, + ModuleName + ); + + if (LogHandle == NULL) { + printf("OpenEventLog Error - %d\n", GetLastError()); + + } else { + printf("SUCCESS\n"); + + // + // Clear the log file and back it up to "view.log" + // + + printf("Calling ClearEventLog backing up to view.log "); + BackupName = L"\\\\danhi386\\roote\\view.log"; + + Status = ClearEventLogW ( + LogHandle, + BackupName + ); + + if (!Status) { + printf ("ClearEventLog Error - %d\n", GetLastError()); + } else { + printf ("SUCCESS\n"); + } + + // + // Now just clear the file without backing it up + // + printf("Calling ClearEventLog with no backup "); + Status = ClearEventLogW ( + LogHandle, + NULL + ); + + if (!Status) { + printf ("ClearEventLogError - %d\n", GetLastError()); + } else { + printf ("SUCCESS\n"); + } + + printf("Calling CloseEventLog\n"); + IStatus = CloseEventLog (LogHandle); + } + + return(Status); +} + +BOOL +TestBackupLogFile (LPSTR BackupFileName) + +{ + BOOL Status, IStatus; + HANDLE LogHandle; + LPWSTR ModuleName; + ANSI_STRING AnsiString; + UNICODE_STRING UnicodeString; + + printf("Testing BackupLogFile API\n"); + // + // Initialize the strings + // + ModuleName = L"TESTWINAPP"; + + // + // Open the log handle + // + printf("Calling OpenEventLog for BACKUP - "); + LogHandle = OpenEventLogW ( + NULL, + ModuleName + ); + + if (LogHandle == NULL) { + printf("OpenEventLog Failure %d\n", GetLastError()); + + } else { + printf("OpenEventLog SUCCESS\n"); + + // + // Backup the log file to BackupFileName + // + + printf("Calling BackupEventLog backing up to %s ", BackupFileName); + + RtlInitAnsiString(&AnsiString, BackupFileName); + RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE); + + Status = BackupEventLogW (LogHandle, UnicodeString.Buffer); + + if (!Status) { + printf ("BackupEventLog failure - %d\n", GetLastError()); + } else { + printf ("SUCCESS\n"); + } + + printf("Calling CloseEventLog\n"); + IStatus = CloseEventLog (LogHandle); + } + + return(Status); +} + +VOID +NotifyThread( + HANDLE hEventLog) +{ + Sleep(30000); + printf("NotifyThread: Writing an event...\n"); + if (!WriteLogEntryMsg(hEventLog,1)) { + printf("NotifyThread: WriteLogEntryMsg failed\n"); + } + else { + printf("Event was written\n"); + } + ExitThread(NO_ERROR); +} + +VOID +TestChangeNotify( + ) + +/*++ + +Routine Description: + + +Arguments: + + +Return Value: + + +--*/ +{ + HANDLE hEvent; + HANDLE hThread; + HANDLE hEventLog; + DWORD threadId; + DWORD status; + + hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); + if (hEvent == NULL) { + printf("CreateEvent Failed %d\n",GetLastError()); + return; + } +#ifdef TEST_REMOTE + hEventLog = RegisterEventSourceW(L"\\\\DANL2",L"TESTWINAPP"); +#else + hEventLog = RegisterEventSourceW(NULL,L"TESTWINAPP"); +#endif + if (hEventLog == NULL) { + printf("OpenEventLog failed %d\n",GetLastError()); + } + +#ifdef TEST_NOTIFY + + if (!NotifyChangeEventLog(hEventLog,hEvent)) { + printf("NotifyChangeEventLog failed %d\n",GetLastError()); + } +#endif // TEST_NOTIFY + + hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)NotifyThread,hEventLog,0,&threadId); + if (hThread == NULL) { + printf("CreateThread Failed %d\n",GetLastError()); + CloseHandle(hEvent); + return; + } + + CloseHandle(hThread); + + printf("Wait for event to become signaled\n"); + status = WaitForSingleObject(hEvent,INFINITE); + if (status == WAIT_OBJECT_0) { + printf("The Event was signaled\n"); + } + else { + printf("The Event was NOT signaled\n"); + } + return; +} +/****************************************************************************/ +DWORD _CRTAPI1 +main ( + IN SHORT argc, + IN PSZ argv[], + IN PSZ envp[] + ) +/*++ +* +* Routine Description: +* +* +* +* Arguments: +* +* +* +* +* Return Value: +* +* +* +--*/ +/****************************************************************************/ +{ + + DWORD ReadFlags; + + Initialize(); // Init any data + + if ( argc < 2 ) { + printf( "Not enough parameters\n" ); + return Usage( ); + } + + if ( stricmp( argv[1], "-c" ) == 0 ) { + + if ( argc < 3 ) { + return TestClearLogFile(); + } + } + else if ( stricmp( argv[1], "-b" ) == 0 ) { + + if ( argc < 3 ) { + printf("You must supply a filename to backup to\n"); + return(FALSE); + } + + return TestBackupLogFile(argv[2]); + + } else if (stricmp ( argv[1], "-rsf" ) == 0 ) { + + ReadFlags = EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ; + if ( argc < 3 ) { + return TestReadEventLog(1,ReadFlags,0 ); + } else { + return Usage(); + } + } else if (stricmp ( argv[1], "-rsb" ) == 0 ) { + + ReadFlags = EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ; + if ( argc < 3 ) { + return TestReadEventLog(1,ReadFlags,0 ); + } else { + return Usage(); + } + } else if (stricmp ( argv[1], "-n" ) == 0 ) { + TestChangeNotify(); + + } else if (stricmp ( argv[1], "-rrf" ) == 0 ) { + + ReadFlags = EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ; + if ( argc < 3 ) { + return TestReadEventLog(1,ReadFlags ,1); + } else if (argc == 3) { + return (TestReadEventLog (1, ReadFlags, atoi(argv[2]))); + } + } else if (stricmp ( argv[1], "-rrb" ) == 0 ) { + + ReadFlags = EVENTLOG_SEEK_READ | EVENTLOG_BACKWARDS_READ; + if ( argc < 3 ) { + return TestReadEventLog(1,ReadFlags, 1); + } else if (argc == 3) { + return (TestReadEventLog (1, ReadFlags, atoi(argv[2]))); + } + } else if (stricmp ( argv[1], "-w" ) == 0 ) { + + if ( argc < 3 ) { + return TestWriteEventLog(1); + } else if (argc == 3) { + return (TestWriteEventLog (atoi(argv[2]))); + } + + } else { + + return Usage(); + } + + UNREFERENCED_PARAMETER(argc); + UNREFERENCED_PARAMETER(argv); + UNREFERENCED_PARAMETER(envp); + + +} |