////////////////////////////////////////////////////////////////////////////// // // 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 #include #include #include #pragma warning(push) #if _MSC_VER > 1400 #pragma warning(disable:6102 6103) // /analyze warnings #endif #include #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; }