Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

200 lines
4.4 KiB

/*++
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;
}