summaryrefslogtreecommitdiffstats
path: root/private/eventlog/test/testwin.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/eventlog/test/testwin.c')
-rw-r--r--private/eventlog/test/testwin.c770
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);
+
+
+}