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