|
|
/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
Pipe.cpp
Abstract:
Implements code that creates and maintains the named pipe server
Notes:
Unicode only
History:
05/04/2001 rparsons Created
--*/
#include "precomp.h"
extern APPINFO g_ai;
/*++
Routine Description:
Creates a pipe and waits for a client connection to occur
Arguments:
*pVoid - Not used
Return Value:
TRUE on success, FALSE otherwise
--*/ UINT CreatePipeAndWait( IN VOID* pVoid ) { HANDLE hPipe, hThread; BOOL fConnected = FALSE; while (g_ai.fMonitor) { //
// Create the named pipe
//
hPipe = CreateNamedPipe(PIPE_NAME, // pipe name
PIPE_ACCESS_INBOUND, // read access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
0, // output buffer size
2048, // input buffer size
0, // client time-out
NULL); // no security attribute
if (INVALID_HANDLE_VALUE == hPipe) { return -1; }
//
// Wait for clients to connect
//
fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
if (fConnected && g_ai.fMonitor) { hThread = (HANDLE) _beginthreadex(NULL, 0, &InstanceThread, (LPVOID)hPipe, 0, &g_ai.uInstThreadId); if (INVALID_HANDLE_VALUE == hThread) { return -1; } else { CloseHandle(hThread); } } else { CloseHandle(hPipe); } }
return 0; }
/*++
Routine Description:
Creates a thread that is responsible for starting the named pipe server
Arguments:
None
Return Value:
TRUE on success, FALSE otherwise
--*/ BOOL CreateReceiveThread( IN VOID ) { HANDLE hThread;
hThread = (HANDLE) _beginthreadex(NULL, 0, &CreatePipeAndWait, NULL, 0, &g_ai.uThreadId); CloseHandle(hThread);
return TRUE; }
/*++
Routine Description:
Thread callback responsible for receiving data from the client
Arguments:
*pVoid - A handle to the pipe
Return Value:
TRUE on success, FALSE otherwise
--*/ UINT InstanceThread( IN VOID *pVoid ) { HANDLE hPipe; BOOL fSuccess = TRUE; DWORD cbBytesRead = 0; WCHAR wszBuffer[2048]; WCHAR *p; int nCount = 0;
// Get the pipe handle
hPipe = (HANDLE)pVoid;
while (TRUE) { fSuccess = ReadFile(hPipe, wszBuffer, 2048, &cbBytesRead, NULL);
if (!fSuccess || cbBytesRead == 0) break;
// Ensure that the data is NULL terminated
wszBuffer[cbBytesRead / sizeof(WCHAR)] = 0;
// See if this is a new process notification
p = wcsstr(wszBuffer, L"process");
if (p) {
// We got a new process notification.
// See if any items are already in the list
nCount = ListView_GetItemCount(g_ai.hWndList);
if (nCount) { AddListViewItem(L""); } } // Add the item to the list box in a normal fashion
AddListViewItem(wszBuffer); }
// Flush the pipe to allow the client to read the pipe's contents
// before disconnecting. Then disconnect the pipe, and close the
// handle to this pipe instance
FlushFileBuffers(hPipe); DisconnectNamedPipe(hPipe); CloseHandle(hPipe); return TRUE; }
|