105 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| 
								 | 
							
								//////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  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;
							 | 
						||
| 
								 | 
							
								}
							 |