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; | ||
|  | } |