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