diff options
Diffstat (limited to 'private/eventlog/test/testwina.c')
-rw-r--r-- | private/eventlog/test/testwina.c | 693 |
1 files changed, 693 insertions, 0 deletions
diff --git a/private/eventlog/test/testwina.c b/private/eventlog/test/testwina.c new file mode 100644 index 000000000..efd558f57 --- /dev/null +++ b/private/eventlog/test/testwina.c @@ -0,0 +1,693 @@ +/*++ + +Copyright (c) 1990 Microsoft Corporation + +Module Name: + + TESTWINA.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> +//#include <elfcommn.h> + + +#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]; +BOOL bHackTestBackup = FALSE; +PCHAR pServerName = 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( "-c Tests ClearEventLog API\n"); + printf( "-b filename Tests BackupEventLog API\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 +#define MAX_STRING_SIZE 32767 // Max size is FFFF/2 for ANSI strings + + BOOL Status; + WORD EventType; + DWORD i; + DWORD DataSize; + PSID pUserSid; + PCHAR BigString; + + // PSTR Strings[NUM_STRINGS] = {"StringAOne","StringATwo" }; + PSTR Strings[NUM_STRINGS]; + + Strings[0] = "StringAOne"; + + BigString = malloc(MAX_STRING_SIZE); + + for (i = 0; i < MAX_STRING_SIZE; i++) { + BigString[i] = 'A'; + } + + BigString[MAX_STRING_SIZE-1] = '\0'; + Strings[1] = BigString; + + EventType = EVENTLOG_INFORMATION_TYPE; + pUserSid = NULL; + DataSize = sizeof(DWORD) * SIZE_DATA_ARRAY; + + for (i=0; i< SIZE_DATA_ARRAY; i++) + Data[i] += i; + + Status = ReportEventA ( + LogHandle, + EventType, + 0, // event category + EventID, + pUserSid, + (WORD) NUM_STRINGS, + DataSize, + Strings, + (PVOID)Data + ); + + free(BigString); + return (Status); +} + +BOOL +WriteLogEntryMsg ( HANDLE LogHandle, DWORD EventID ) +/* + This function requires a registry entry in the Applications section + of the Eventlog for TESTWINAAPP, it will use the netevent.dll message file. +*/ +{ +#define NUM_STRINGS 2 + + BOOL Status; + WORD EventType; + DWORD DataSize; + PSID pUserSid; + PCHAR BigString; + + PSTR Strings[NUM_STRINGS]; + + Strings[0] = "This is a BOGUS message for TEST purposes Ignore this substitution text"; + Strings[1] = "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; + + Status = ReportEventA ( + LogHandle, + EventType, + 0, // event category + EVENT_SERVICE_START_FAILED_NONE, + pUserSid, + (WORD) NUM_STRINGS, + 0, // DataSize + Strings, + (PVOID)NULL // Data + ); + + free(BigString); + return (Status); +} + + +VOID +DisplayEventRecords( PVOID Buffer, + DWORD BufSize, + ULONG *NumRecords) + +{ + PEVENTLOGRECORD pLogRecord; + PSTR pString; + DWORD Count = 0; + DWORD Offset = 0; + DWORD i; + + pLogRecord = (PEVENTLOGRECORD) Buffer; + + while ((DWORD)Offset < BufSize) { + + Count++; + + printf("\n\nRecord # %lu\n", pLogRecord->RecordNumber); + + 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 + // + pString = (PSTR)((DWORD)pLogRecord + sizeof(EVENTLOGRECORD)); + printf("ModuleName: %s ", pString); + + // + // Display ComputerName + // + pString = (PSTR)((DWORD)pString + strlen(pString) + 1); + printf("ComputerName: %s\n",pString); + + // + // Display strings + // + pString = (PSTR)((DWORD)Buffer + pLogRecord->StringOffset); + + printf("Strings: "); + for (i=0; i<pLogRecord->NumStrings; i++) { + + printf(" %s ", pString); + pString = (PSTR)((DWORD)pString + strlen(pString) + 1); + } + + // 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 = ReadEventLogA ( + LogHandle, + ReadFlag, + Record, + Buffer, + READ_BUFFER_SIZE, + pBytesRead, + &MinBytesNeeded + ); + + + if (!Status) { + ErrorCode = GetLastError(); + printf("Error from ReadEventLog %d \n", ErrorCode); + if (ErrorCode == ERROR_NO_MORE_FILES) + printf("Buffer too small. Need %lu bytes min\n", MinBytesNeeded); + + } + + return (Status); +} + + + + +BOOL +TestReadEventLog (DWORD Count, DWORD ReadFlag, DWORD Record) + +{ + BOOL Status, IStatus; + + HANDLE LogHandle; + LPSTR 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 = "TESTWINAAPP"; + + // + // Open the log handle + // + + // + // This is just a quick and dirty way to test the api to read a backup + // log, until I can fix test.c to be more general purpose. + // + + if (bHackTestBackup) { + printf("OpenBackupEventLog = "); + LogHandle = OpenBackupEventLog( + NULL, + "\\\\danhi386\\roote\\view.log" + ); + } + else { + printf("OpenEventLog - "); + LogHandle = OpenEventLog ( + pServerName, + ModuleName + ); + } + + if (LogHandle == NULL) { + printf("Error - %d\n", GetLastError()); + + } else { + printf("SUCCESS\n"); + + // + // Get and print record information + // + + Status = GetNumberOfEventLogRecords(LogHandle, & NumberOfRecords); + if (NT_SUCCESS(Status)) { + Status = GetOldestEventLogRecord(LogHandle, & OldestRecord); + } + + if (!NT_SUCCESS(Status)) { + printf("Get of record information failed with %X", Status); + return(Status); + } + + printf("\nThere are %d records in the file, %d is the oldest" + " record number\n", NumberOfRecords, OldestRecord); + + RecordOffset = Record; + + while (Count && (BytesReturned != 0)) { + + printf("Read %u records\n", NumRecords); + // + // Read from the log + // + Status = ReadFromLog ( LogHandle, + Buffer, + &BytesReturned, + ReadFlag, + RecordOffset + ); + if (Status) { + printf("Bytes read = 0x%lx\n", BytesReturned); + DisplayEventRecords(Buffer, BytesReturned, &NumRecords); + Count -= NumRecords; + RecordOffset += NumRecords; + } else { + break; + } + + } + printf("\n"); + + if (!Status) { + printf ("Error - %d. Remaining count %lu\n", GetLastError(), Count); + } else { + printf ("SUCCESS\n"); + } + + printf("Calling CloseEventLog\n"); + IStatus = CloseEventLog (LogHandle); + } + free(Buffer); + return (Status); +} + + + +BOOL +TestWriteEventLog (DWORD Count) + +{ + BOOL Status, IStatus; + HANDLE LogHandle=NULL; + LPSTR ModuleName; + DWORD EventID = 99; + DWORD WriteCount; + + printf("Testing ReportEvent API\n"); + + // + // Initialize the strings + // + ModuleName = "TESTWINAAPP"; + + // + // Open the log handle + // + while (Count && NT_SUCCESS(Status)) { + //printf("Calling RegisterEventSource for WRITE %lu times - ", Count); + LogHandle = RegisterEventSourceA ( + pServerName, + ModuleName + ); + + if (LogHandle == NULL) { + printf("Error - %d\n", GetLastError()); + + } else { + printf("Registered - "); + WriteCount = 5; + printf("Record # %u ", Count); + + while (WriteCount && NT_SUCCESS(Status)) { + + // + // Write an entry into the log + // + Data[0] = Count; // Make data "unique" + EventID = (EventID + Count) % 100; // Vary the eventids + Status = WriteLogEntryMsg ( LogHandle, EventID ); + Count--; + WriteCount--; + + if (!Status) { + printf ("Error - %d. Remaining count %lu\n", GetLastError(), Count); + } else { + printf ("%d,",WriteCount); + } + } + IStatus = DeregisterEventSource (LogHandle); + printf(" - Deregistered\n"); + } + } + + return (Status); +} + + + +BOOL +TestClearLogFile () + +{ + BOOL Status, IStatus; + HANDLE LogHandle; + LPSTR ModuleName, BackupName; + + printf("Testing ClearLogFile API\n"); + // + // Initialize the strings + // + ModuleName = "TESTWINAAPP"; + + // + // Open the log handle + // + printf("Calling OpenEventLog for CLEAR - "); + LogHandle = OpenEventLogA ( + pServerName, + ModuleName + ); + + if (!Status) { + printf("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 = "view.log"; + + Status = ClearEventLogA ( + LogHandle, + BackupName + ); + + if (!Status) { + printf ("Error - %d\n", GetLastError()); + } else { + printf ("SUCCESS\n"); + } + + // + // Now just clear the file without backing it up + // + printf("Calling ClearEventLog with no backup "); + Status = ClearEventLogA ( + LogHandle, + NULL + ); + + if (!Status) { + printf ("Error - %d\n", GetLastError()); + } else { + printf ("SUCCESS\n"); + } + + printf("Calling CloseEventLog\n"); + IStatus = CloseEventLog (LogHandle); + } + + return(Status); +} + + +BOOL +TestBackupLogFile( + LPSTR FileName + ) + +{ + HANDLE LogHandle; + + printf("Testing BackupEventLog API\n"); + + // + // Open the log handle + // + + printf("Calling ElfOpenEventLog for BACKUP - "); + LogHandle = OpenEventLogA ( + NULL, + "Application" + ); + + if (!LogHandle) { + printf("Error - %d\n", GetLastError()); + + } else { + printf("SUCCESS\n"); + + // + // Backup the log file + // + + printf("Calling BackupEventLogFile backing up to %s\n", FileName); + + if (!BackupEventLogA ( + LogHandle, + FileName + )) { + printf ("Error - %d\n", GetLastError()); + } else { + printf ("SUCCESS\n"); + } + + + printf("Calling CloseEventLog - "); + if (CloseEventLog (LogHandle)) { + printf("Success\n"); + } + else { + printf("Failed with code %d\n", GetLastError()); + } + } + + return(TRUE); +} + + +/****************************************************************************/ +BOOL +main ( + IN SHORT argc, + IN PSZ argv[], + ) +/*++ +* +* Routine Description: +* +* +* +* Arguments: +* +* +* +* +* Return Value: +* +* +* +--*/ +/****************************************************************************/ +{ + + DWORD ReadFlags; + + Initialize(); // Init any data + + // + // Just till I can replace this horrid parm parsing with my own + // + + if (getenv("REMOTE")) { + pServerName = "\\\\danhi20"; + } + + 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 ) { + return Usage(); + } else { + 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], "-xsf" ) == 0 ) { + + ReadFlags = EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ; + bHackTestBackup = TRUE; + 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], "-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); + + +} |