diff options
Diffstat (limited to 'samples/syelog/sltestp.cpp')
-rw-r--r-- | samples/syelog/sltestp.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/samples/syelog/sltestp.cpp b/samples/syelog/sltestp.cpp new file mode 100644 index 0000000..50856ac --- /dev/null +++ b/samples/syelog/sltestp.cpp @@ -0,0 +1,104 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Detours Test Program (sltestp.cpp of sltestp.exe) +// +// Microsoft Research Detours Package +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// Test the named-pipe-based connection 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" + +VOID MyErrExit(PCSTR pszMsg) +{ + fprintf(stderr, "Error %s: %ld\n", pszMsg, GetLastError()); + exit(1); +} + +DWORD main(int argc, char *argv[]) +{ + HANDLE hPipe; + SYELOG_MESSAGE Message; + BOOL fSuccess; + DWORD cbWritten, dwMode; + + // Try to open a named pipe; wait for it, if necessary. + + TIME_ZONE_INFORMATION tzi; + GetTimeZoneInformation(&tzi); + + for (;;) { + hPipe = CreateFileW(SYELOG_PIPE_NAMEW, // pipe name + GENERIC_WRITE, // write access only + 0, // no sharing + NULL, // no security attributes + OPEN_EXISTING, // opens existing pipe + 0, // default attributes + NULL); // no template file + + // Break if the pipe handle is valid. + if (hPipe != INVALID_HANDLE_VALUE) + break; + + // Exit if an error other than ERROR_PIPE_BUSY occurs. + + if (GetLastError() != ERROR_PIPE_BUSY) + MyErrExit("Could not open pipe"); + + // All pipe instances are busy, so wait for 1 seconds. + + if (!WaitNamedPipeW(SYELOG_PIPE_NAMEW, 1000)) + MyErrExit("Could not open pipe"); + } + + // The pipe connected; change to message-read mode. + dwMode = PIPE_READMODE_MESSAGE; + fSuccess = SetNamedPipeHandleState(hPipe, // pipe handle + &dwMode, // new pipe mode + NULL, // don't set maximum bytes + NULL); // don't set maximum time + if (!fSuccess) + MyErrExit("SetNamedPipeHandleState"); + + // Send a message to the pipe server. + + memset(&Message, 0, sizeof(Message)); + + StringCchCopyA(Message.szMessage, ARRAYSIZE(Message.szMessage), + (argc > 1) ? argv[1] : "sltestp: hello world!"); + + Message.nFacility = SYELOG_FACILITY_APPLICATION; + Message.nSeverity = SYELOG_SEVERITY_INFORMATION; + Message.nProcessId = GetCurrentProcessId(); + GetSystemTimeAsFileTime(&Message.ftOccurance); + PCSTR pszEnd = Message.szMessage; + for (; *pszEnd; pszEnd++) { + // no internal contents. + } + Message.nBytes = (USHORT)(pszEnd - ((PCSTR)&Message) + 1); + + fSuccess = WriteFile(hPipe, // pipe handle + &Message, // message + Message.nBytes, // message length + &cbWritten, // bytes written + NULL); // not overlapped + if (! fSuccess) + MyErrExit("WriteFile"); + + CloseHandle(hPipe); + + GetTimeZoneInformation(&tzi); + + return 0; +} |