mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|