146 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			146 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| 
								 | 
							
								//////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Detours Test Program (sltest.cpp of sltest.exe)
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Microsoft Research Detours Package
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Copyright (c) Microsoft Corporation.  All rights reserved.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Test the named-pipe-based connection with syelog.lib to the syelog
							 | 
						||
| 
								 | 
							
								//  system-event logger.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								#include <windows.h>
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <stddef.h>
							 | 
						||
| 
								 | 
							
								#pragma warning(push)
							 | 
						||
| 
								 | 
							
								#if _MSC_VER > 1400
							 | 
						||
| 
								 | 
							
								#pragma warning(disable:6102 6103) // /analyze warnings
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#include <strsafe.h>
							 | 
						||
| 
								 | 
							
								#pragma warning(pop)
							 | 
						||
| 
								 | 
							
								#include "syelog.h"
							 | 
						||
| 
								 | 
							
								#include "detours.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    HANDLE ( WINAPI *
							 | 
						||
| 
								 | 
							
								             Real_CreateFileW)(LPCWSTR a0,
							 | 
						||
| 
								 | 
							
								                               DWORD a1,
							 | 
						||
| 
								 | 
							
								                               DWORD a2,
							 | 
						||
| 
								 | 
							
								                               LPSECURITY_ATTRIBUTES a3,
							 | 
						||
| 
								 | 
							
								                               DWORD a4,
							 | 
						||
| 
								 | 
							
								                               DWORD a5,
							 | 
						||
| 
								 | 
							
								                               HANDLE a6)
							 | 
						||
| 
								 | 
							
								        = CreateFileW;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    BOOL ( WINAPI *
							 | 
						||
| 
								 | 
							
								           Real_WriteFile)(HANDLE hFile,
							 | 
						||
| 
								 | 
							
								                           LPCVOID lpBuffer,
							 | 
						||
| 
								 | 
							
								                           DWORD nNumberOfBytesToWrite,
							 | 
						||
| 
								 | 
							
								                           LPDWORD lpNumberOfBytesWritten,
							 | 
						||
| 
								 | 
							
								                           LPOVERLAPPED lpOverlapped)
							 | 
						||
| 
								 | 
							
								        = WriteFile;
							 | 
						||
| 
								 | 
							
								    BOOL ( WINAPI *
							 | 
						||
| 
								 | 
							
								           Real_FlushFileBuffers)(HANDLE hFile)
							 | 
						||
| 
								 | 
							
								        = FlushFileBuffers;
							 | 
						||
| 
								 | 
							
								    BOOL ( WINAPI *
							 | 
						||
| 
								 | 
							
								           Real_CloseHandle)(HANDLE hObject)
							 | 
						||
| 
								 | 
							
								        = CloseHandle;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    BOOL ( WINAPI *
							 | 
						||
| 
								 | 
							
								           Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut)
							 | 
						||
| 
								 | 
							
								        = WaitNamedPipeW;
							 | 
						||
| 
								 | 
							
								    BOOL ( WINAPI *
							 | 
						||
| 
								 | 
							
								           Real_SetNamedPipeHandleState)(HANDLE hNamedPipe,
							 | 
						||
| 
								 | 
							
								                                         LPDWORD lpMode,
							 | 
						||
| 
								 | 
							
								                                         LPDWORD lpMaxCollectionCount,
							 | 
						||
| 
								 | 
							
								                                         LPDWORD lpCollectDataTimeout)
							 | 
						||
| 
								 | 
							
								        = SetNamedPipeHandleState;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    DWORD ( WINAPI *
							 | 
						||
| 
								 | 
							
								            Real_GetCurrentProcessId)(VOID)
							 | 
						||
| 
								 | 
							
								        = GetCurrentProcessId;
							 | 
						||
| 
								 | 
							
								    VOID ( WINAPI *
							 | 
						||
| 
								 | 
							
								           Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime)
							 | 
						||
| 
								 | 
							
								        = GetSystemTimeAsFileTime;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    VOID ( WINAPI *
							 | 
						||
| 
								 | 
							
								           Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection)
							 | 
						||
| 
								 | 
							
								        = InitializeCriticalSection;
							 | 
						||
| 
								 | 
							
								    VOID ( WINAPI *
							 | 
						||
| 
								 | 
							
								           Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection)
							 | 
						||
| 
								 | 
							
								        = EnterCriticalSection;
							 | 
						||
| 
								 | 
							
								    VOID ( WINAPI *
							 | 
						||
| 
								 | 
							
								           Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection)
							 | 
						||
| 
								 | 
							
								        = LeaveCriticalSection;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main(int argc, char **argv)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    BOOL fNeedHelp = FALSE;
							 | 
						||
| 
								 | 
							
								    BOOL fRequestExitOnClose = FALSE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    int arg = 1;
							 | 
						||
| 
								 | 
							
								    for (; arg < argc && (argv[arg][0] == '-' || argv[arg][0] == '/'); arg++) {
							 | 
						||
| 
								 | 
							
								        CHAR *argn = argv[arg] + 1;
							 | 
						||
| 
								 | 
							
								        CHAR *argp = argn;
							 | 
						||
| 
								 | 
							
								        while (*argp && *argp != ':') {
							 | 
						||
| 
								 | 
							
								            argp++;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (*argp == ':') {
							 | 
						||
| 
								 | 
							
								            *argp++ = '\0';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        switch (argn[0]) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          case 'x':                                 // Request exit on close.
							 | 
						||
| 
								 | 
							
								          case 'X':
							 | 
						||
| 
								 | 
							
								            fRequestExitOnClose = TRUE;
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          case '?':                                 // Help.
							 | 
						||
| 
								 | 
							
								            fNeedHelp = TRUE;
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          default:
							 | 
						||
| 
								 | 
							
								            fNeedHelp = TRUE;
							 | 
						||
| 
								 | 
							
								            printf("SLTEST: Bad argument: %s:%s\n", argn, argp);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (fNeedHelp) {
							 | 
						||
| 
								 | 
							
								        printf("Usage:\n"
							 | 
						||
| 
								 | 
							
								               "    sltest.exe [options] message\n"
							 | 
						||
| 
								 | 
							
								               "Options:\n"
							 | 
						||
| 
								 | 
							
								               "    /x         Ask syelogd.exe to terminate when this connect closes.\n"
							 | 
						||
| 
								 | 
							
								               "    /?         Display this help message.\n"
							 | 
						||
| 
								 | 
							
								               "\n");
							 | 
						||
| 
								 | 
							
								        exit(1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    SyelogOpen("sltest", SYELOG_FACILITY_APPLICATION);
							 | 
						||
| 
								 | 
							
								    if (arg >= argc) {
							 | 
						||
| 
								 | 
							
								        Syelog(SYELOG_SEVERITY_INFORMATION, "Hello World! [1 of 4]");
							 | 
						||
| 
								 | 
							
								        Syelog(SYELOG_SEVERITY_INFORMATION, "Hello World! [2 of 4]");
							 | 
						||
| 
								 | 
							
								        Syelog(SYELOG_SEVERITY_INFORMATION, "Hello World! [3 of 4]");
							 | 
						||
| 
								 | 
							
								        Syelog(SYELOG_SEVERITY_INFORMATION, "Hello World! [4 of 4]");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								        CHAR Buffer[1024] = "";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        for (; arg < argc; arg++) {
							 | 
						||
| 
								 | 
							
								            StringCchCatA(Buffer, ARRAYSIZE(Buffer), argv[arg]);
							 | 
						||
| 
								 | 
							
								            if (arg + 1 < argc) {
							 | 
						||
| 
								 | 
							
								                StringCchCatA(Buffer, ARRAYSIZE(Buffer), " ");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        Syelog(SYELOG_SEVERITY_INFORMATION, Buffer);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    SyelogClose(fRequestExitOnClose);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 |