diff options
Diffstat (limited to 'samples/syelog/sltest.cpp')
-rw-r--r-- | samples/syelog/sltest.cpp | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/samples/syelog/sltest.cpp b/samples/syelog/sltest.cpp new file mode 100644 index 0000000..8377872 --- /dev/null +++ b/samples/syelog/sltest.cpp @@ -0,0 +1,145 @@ +////////////////////////////////////////////////////////////////////////////// +// +// 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; +} |