|
|
/*++
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 __cdecl 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);
}
|