|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include <stdio.h>
|
|
Packit |
1fb8d4 |
#include <winpr/crt.h>
|
|
Packit |
1fb8d4 |
#include <winpr/pipe.h>
|
|
Packit |
1fb8d4 |
#include <winpr/file.h>
|
|
Packit |
1fb8d4 |
#include <winpr/tchar.h>
|
|
Packit |
1fb8d4 |
#include <winpr/winpr.h>
|
|
Packit |
1fb8d4 |
#include <winpr/print.h>
|
|
Packit |
1fb8d4 |
#include <winpr/synch.h>
|
|
Packit |
1fb8d4 |
#include <winpr/wlog.h>
|
|
Packit |
1fb8d4 |
#include <winpr/thread.h>
|
|
Packit |
1fb8d4 |
#ifndef _WIN32
|
|
Packit |
1fb8d4 |
#include <signal.h>
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
#include "../pipe.h"
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
#define PIPE_BUFFER_SIZE 32
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
static HANDLE ReadyEvent;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
static LPTSTR lpszPipeNameMt = _T("\\\\.\\pipe\\winpr_test_pipe_mt");
|
|
Packit |
1fb8d4 |
static LPTSTR lpszPipeNameSt = _T("\\\\.\\pipe\\winpr_test_pipe_st");
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
static BOOL testFailed = FALSE;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
static DWORD WINAPI named_pipe_client_thread(LPVOID arg)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
HANDLE hNamedPipe = NULL;
|
|
Packit |
1fb8d4 |
BYTE* lpReadBuffer = NULL;
|
|
Packit |
1fb8d4 |
BYTE* lpWriteBuffer = NULL;
|
|
Packit |
1fb8d4 |
BOOL fSuccess = FALSE;
|
|
Packit |
1fb8d4 |
DWORD nNumberOfBytesToRead;
|
|
Packit |
1fb8d4 |
DWORD nNumberOfBytesToWrite;
|
|
Packit |
1fb8d4 |
DWORD lpNumberOfBytesRead;
|
|
Packit |
1fb8d4 |
DWORD lpNumberOfBytesWritten;
|
|
Packit |
1fb8d4 |
WaitForSingleObject(ReadyEvent, INFINITE);
|
|
Packit Service |
5a9772 |
hNamedPipe =
|
|
Packit Service |
5a9772 |
CreateFile(lpszPipeNameMt, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (hNamedPipe == INVALID_HANDLE_VALUE)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Named Pipe CreateFile failure: INVALID_HANDLE_VALUE\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!(lpReadBuffer = (BYTE*)malloc(PIPE_BUFFER_SIZE)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Error allocating read buffer\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!(lpWriteBuffer = (BYTE*)malloc(PIPE_BUFFER_SIZE)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Error allocating write buffer\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
lpNumberOfBytesWritten = 0;
|
|
Packit |
1fb8d4 |
nNumberOfBytesToWrite = PIPE_BUFFER_SIZE;
|
|
Packit |
1fb8d4 |
FillMemory(lpWriteBuffer, PIPE_BUFFER_SIZE, 0x59);
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!WriteFile(hNamedPipe, lpWriteBuffer, nNumberOfBytesToWrite, &lpNumberOfBytesWritten,
|
|
Packit Service |
5a9772 |
NULL) ||
|
|
Packit Service |
5a9772 |
lpNumberOfBytesWritten != nNumberOfBytesToWrite)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Client NamedPipe WriteFile failure\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
lpNumberOfBytesRead = 0;
|
|
Packit |
1fb8d4 |
nNumberOfBytesToRead = PIPE_BUFFER_SIZE;
|
|
Packit |
1fb8d4 |
ZeroMemory(lpReadBuffer, PIPE_BUFFER_SIZE);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!ReadFile(hNamedPipe, lpReadBuffer, nNumberOfBytesToRead, &lpNumberOfBytesRead, NULL) ||
|
|
Packit Service |
5a9772 |
lpNumberOfBytesRead != nNumberOfBytesToRead)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Client NamedPipe ReadFile failure\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
printf("Client ReadFile: %" PRIu32 " bytes\n", lpNumberOfBytesRead);
|
|
Packit |
1fb8d4 |
winpr_HexDump("pipe.test", WLOG_DEBUG, lpReadBuffer, lpNumberOfBytesRead);
|
|
Packit |
1fb8d4 |
fSuccess = TRUE;
|
|
Packit |
1fb8d4 |
out:
|
|
Packit |
1fb8d4 |
free(lpReadBuffer);
|
|
Packit |
1fb8d4 |
free(lpWriteBuffer);
|
|
Packit |
1fb8d4 |
CloseHandle(hNamedPipe);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!fSuccess)
|
|
Packit |
1fb8d4 |
testFailed = TRUE;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
ExitThread(0);
|
|
Packit |
1fb8d4 |
return 0;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
static DWORD WINAPI named_pipe_server_thread(LPVOID arg)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
HANDLE hNamedPipe = NULL;
|
|
Packit |
1fb8d4 |
BYTE* lpReadBuffer = NULL;
|
|
Packit |
1fb8d4 |
BYTE* lpWriteBuffer = NULL;
|
|
Packit |
1fb8d4 |
BOOL fSuccess = FALSE;
|
|
Packit |
1fb8d4 |
BOOL fConnected = FALSE;
|
|
Packit |
1fb8d4 |
DWORD nNumberOfBytesToRead;
|
|
Packit |
1fb8d4 |
DWORD nNumberOfBytesToWrite;
|
|
Packit |
1fb8d4 |
DWORD lpNumberOfBytesRead;
|
|
Packit |
1fb8d4 |
DWORD lpNumberOfBytesWritten;
|
|
Packit Service |
5a9772 |
hNamedPipe = CreateNamedPipe(
|
|
Packit Service |
5a9772 |
lpszPipeNameMt, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
|
|
Packit Service |
5a9772 |
PIPE_UNLIMITED_INSTANCES, PIPE_BUFFER_SIZE, PIPE_BUFFER_SIZE, 0, NULL);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!hNamedPipe)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: CreateNamedPipe failure: NULL handle\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (hNamedPipe == INVALID_HANDLE_VALUE)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: CreateNamedPipe failure: INVALID_HANDLE_VALUE\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
SetEvent(ReadyEvent);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/**
|
|
Packit |
1fb8d4 |
* Note:
|
|
Packit |
1fb8d4 |
* If a client connects before ConnectNamedPipe is called, the function returns zero and
|
|
Packit |
1fb8d4 |
* GetLastError returns ERROR_PIPE_CONNECTED. This can happen if a client connects in the
|
|
Packit |
1fb8d4 |
* interval between the call to CreateNamedPipe and the call to ConnectNamedPipe.
|
|
Packit |
1fb8d4 |
* In this situation, there is a good connection between client and server, even though
|
|
Packit |
1fb8d4 |
* the function returns zero.
|
|
Packit |
1fb8d4 |
*/
|
|
Packit Service |
5a9772 |
fConnected =
|
|
Packit Service |
5a9772 |
ConnectNamedPipe(hNamedPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!fConnected)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: ConnectNamedPipe failure\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!(lpReadBuffer = (BYTE*)calloc(1, PIPE_BUFFER_SIZE)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Error allocating read buffer\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!(lpWriteBuffer = (BYTE*)malloc(PIPE_BUFFER_SIZE)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Error allocating write buffer\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
lpNumberOfBytesRead = 0;
|
|
Packit |
1fb8d4 |
nNumberOfBytesToRead = PIPE_BUFFER_SIZE;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!ReadFile(hNamedPipe, lpReadBuffer, nNumberOfBytesToRead, &lpNumberOfBytesRead, NULL) ||
|
|
Packit Service |
5a9772 |
lpNumberOfBytesRead != nNumberOfBytesToRead)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Server NamedPipe ReadFile failure\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
printf("Server ReadFile: %" PRIu32 " bytes\n", lpNumberOfBytesRead);
|
|
Packit |
1fb8d4 |
winpr_HexDump("pipe.test", WLOG_DEBUG, lpReadBuffer, lpNumberOfBytesRead);
|
|
Packit |
1fb8d4 |
lpNumberOfBytesWritten = 0;
|
|
Packit |
1fb8d4 |
nNumberOfBytesToWrite = PIPE_BUFFER_SIZE;
|
|
Packit |
1fb8d4 |
FillMemory(lpWriteBuffer, PIPE_BUFFER_SIZE, 0x45);
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!WriteFile(hNamedPipe, lpWriteBuffer, nNumberOfBytesToWrite, &lpNumberOfBytesWritten,
|
|
Packit Service |
5a9772 |
NULL) ||
|
|
Packit Service |
5a9772 |
lpNumberOfBytesWritten != nNumberOfBytesToWrite)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Server NamedPipe WriteFile failure\n", __FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
fSuccess = TRUE;
|
|
Packit |
1fb8d4 |
out:
|
|
Packit |
1fb8d4 |
free(lpReadBuffer);
|
|
Packit |
1fb8d4 |
free(lpWriteBuffer);
|
|
Packit |
1fb8d4 |
CloseHandle(hNamedPipe);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!fSuccess)
|
|
Packit |
1fb8d4 |
testFailed = TRUE;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
ExitThread(0);
|
|
Packit |
1fb8d4 |
return 0;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define TESTNUMPIPESST 16
|
|
Packit |
1fb8d4 |
static DWORD WINAPI named_pipe_single_thread(LPVOID arg)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
HANDLE servers[TESTNUMPIPESST];
|
|
Packit |
1fb8d4 |
HANDLE clients[TESTNUMPIPESST];
|
|
Packit |
1fb8d4 |
char sndbuf[PIPE_BUFFER_SIZE];
|
|
Packit |
1fb8d4 |
char rcvbuf[PIPE_BUFFER_SIZE];
|
|
Packit |
1fb8d4 |
DWORD dwRead;
|
|
Packit |
1fb8d4 |
DWORD dwWritten;
|
|
Packit |
1fb8d4 |
int i;
|
|
Packit |
1fb8d4 |
int numPipes;
|
|
Packit |
1fb8d4 |
BOOL bSuccess = FALSE;
|
|
Packit |
1fb8d4 |
numPipes = TESTNUMPIPESST;
|
|
Packit |
1fb8d4 |
memset(servers, 0, sizeof(servers));
|
|
Packit |
1fb8d4 |
memset(clients, 0, sizeof(clients));
|
|
Packit |
1fb8d4 |
WaitForSingleObject(ReadyEvent, INFINITE);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
for (i = 0; i < numPipes; i++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
if (!(servers[i] = CreateNamedPipe(lpszPipeNameSt, PIPE_ACCESS_DUPLEX,
|
|
Packit Service |
5a9772 |
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
|
|
Packit Service |
5a9772 |
PIPE_UNLIMITED_INSTANCES, PIPE_BUFFER_SIZE,
|
|
Packit Service |
5a9772 |
PIPE_BUFFER_SIZE, 0, NULL)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: CreateNamedPipe #%d failed\n", __FUNCTION__, i);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef _WIN32
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
for (i = 0; i < numPipes; i++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
WINPR_NAMED_PIPE* p = (WINPR_NAMED_PIPE*)servers[i];
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (strcmp(lpszPipeNameSt, p->name))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Pipe name mismatch for pipe #%d ([%s] instead of [%s])\n", __FUNCTION__, i,
|
|
Packit Service |
5a9772 |
p->name, lpszPipeNameSt);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (p->clientfd != -1)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Unexpected client fd value for pipe #%d (%d instead of -1)\n", __FUNCTION__,
|
|
Packit Service |
5a9772 |
i, p->clientfd);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (p->serverfd < 1)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Unexpected server fd value for pipe #%d (%d is not > 0)\n", __FUNCTION__, i,
|
|
Packit Service |
5a9772 |
p->serverfd);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (p->ServerMode == FALSE)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Unexpected ServerMode value for pipe #%d (0 instead of 1)\n", __FUNCTION__,
|
|
Packit Service |
5a9772 |
i);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
for (i = 0; i < numPipes; i++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
BOOL fConnected;
|
|
Packit Service |
5a9772 |
if ((clients[i] = CreateFile(lpszPipeNameSt, GENERIC_READ | GENERIC_WRITE, 0, NULL,
|
|
Packit Service |
5a9772 |
OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: CreateFile #%d failed\n", __FUNCTION__, i);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/**
|
|
Packit |
1fb8d4 |
* Note:
|
|
Packit |
1fb8d4 |
* If a client connects before ConnectNamedPipe is called, the function returns zero and
|
|
Packit |
1fb8d4 |
* GetLastError returns ERROR_PIPE_CONNECTED. This can happen if a client connects in the
|
|
Packit |
1fb8d4 |
* interval between the call to CreateNamedPipe and the call to ConnectNamedPipe.
|
|
Packit |
1fb8d4 |
* In this situation, there is a good connection between client and server, even though
|
|
Packit |
1fb8d4 |
* the function returns zero.
|
|
Packit |
1fb8d4 |
*/
|
|
Packit Service |
5a9772 |
fConnected =
|
|
Packit Service |
5a9772 |
ConnectNamedPipe(servers[i], NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!fConnected)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: ConnectNamedPipe #%d failed. (%" PRIu32 ")\n", __FUNCTION__, i,
|
|
Packit Service |
5a9772 |
GetLastError());
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef _WIN32
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
for (i = 0; i < numPipes; i++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
WINPR_NAMED_PIPE* p = servers[i];
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (p->clientfd < 1)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Unexpected client fd value for pipe #%d (%d is not > 0)\n", __FUNCTION__, i,
|
|
Packit Service |
5a9772 |
p->clientfd);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (p->ServerMode)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Unexpected ServerMode value for pipe #%d (1 instead of 0)\n", __FUNCTION__,
|
|
Packit Service |
5a9772 |
i);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
for (i = 0; i < numPipes; i++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
/* Test writing from clients to servers */
|
|
Packit |
1fb8d4 |
ZeroMemory(sndbuf, sizeof(sndbuf));
|
|
Packit |
1fb8d4 |
ZeroMemory(rcvbuf, sizeof(rcvbuf));
|
|
Packit |
1fb8d4 |
sprintf_s(sndbuf, sizeof(sndbuf), "CLIENT->SERVER ON PIPE #%05d", i);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!WriteFile(clients[i], sndbuf, sizeof(sndbuf), &dwWritten, NULL) ||
|
|
Packit Service |
5a9772 |
dwWritten != sizeof(sndbuf))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Error writing to client end of pipe #%d\n", __FUNCTION__, i);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!ReadFile(servers[i], rcvbuf, dwWritten, &dwRead, NULL) || dwRead != dwWritten)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Error reading on server end of pipe #%d\n", __FUNCTION__, i);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (memcmp(sndbuf, rcvbuf, sizeof(sndbuf)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Error data read on server end of pipe #%d is corrupted\n", __FUNCTION__, i);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Test writing from servers to clients */
|
|
Packit |
1fb8d4 |
ZeroMemory(sndbuf, sizeof(sndbuf));
|
|
Packit |
1fb8d4 |
ZeroMemory(rcvbuf, sizeof(rcvbuf));
|
|
Packit |
1fb8d4 |
sprintf_s(sndbuf, sizeof(sndbuf), "SERVER->CLIENT ON PIPE #%05d", i);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!WriteFile(servers[i], sndbuf, sizeof(sndbuf), &dwWritten, NULL) ||
|
|
Packit Service |
5a9772 |
dwWritten != sizeof(sndbuf))
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Error writing to server end of pipe #%d\n", __FUNCTION__, i);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!ReadFile(clients[i], rcvbuf, dwWritten, &dwRead, NULL) || dwRead != dwWritten)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("%s: Error reading on client end of pipe #%d\n", __FUNCTION__, i);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (memcmp(sndbuf, rcvbuf, sizeof(sndbuf)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Error data read on client end of pipe #%d is corrupted\n", __FUNCTION__, i);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
/**
|
|
Packit |
1fb8d4 |
* After DisconnectNamedPipe on server end
|
|
Packit |
1fb8d4 |
* ReadFile/WriteFile must fail on client end
|
|
Packit |
1fb8d4 |
*/
|
|
Packit |
1fb8d4 |
i = numPipes - 1;
|
|
Packit |
1fb8d4 |
DisconnectNamedPipe(servers[i]);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (ReadFile(clients[i], rcvbuf, sizeof(rcvbuf), &dwRead, NULL))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf(
|
|
Packit Service |
5a9772 |
"%s: Error ReadFile on client should have failed after DisconnectNamedPipe on server\n",
|
|
Packit Service |
5a9772 |
__FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (WriteFile(clients[i], sndbuf, sizeof(sndbuf), &dwWritten, NULL))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Error WriteFile on client end should have failed after DisconnectNamedPipe on "
|
|
Packit Service |
5a9772 |
"server\n",
|
|
Packit Service |
5a9772 |
__FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
CloseHandle(servers[i]);
|
|
Packit |
1fb8d4 |
CloseHandle(clients[i]);
|
|
Packit |
1fb8d4 |
numPipes--;
|
|
Packit |
1fb8d4 |
/**
|
|
Packit |
1fb8d4 |
* After CloseHandle (without calling DisconnectNamedPipe first) on server end
|
|
Packit |
1fb8d4 |
* ReadFile/WriteFile must fail on client end
|
|
Packit |
1fb8d4 |
*/
|
|
Packit |
1fb8d4 |
i = numPipes - 1;
|
|
Packit |
1fb8d4 |
CloseHandle(servers[i]);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (ReadFile(clients[i], rcvbuf, sizeof(rcvbuf), &dwRead, NULL))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Error ReadFile on client end should have failed after CloseHandle on server\n",
|
|
Packit Service |
5a9772 |
__FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (WriteFile(clients[i], sndbuf, sizeof(sndbuf), &dwWritten, NULL))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Error WriteFile on client end should have failed after CloseHandle on server\n",
|
|
Packit Service |
5a9772 |
__FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
CloseHandle(clients[i]);
|
|
Packit |
1fb8d4 |
numPipes--;
|
|
Packit |
1fb8d4 |
/**
|
|
Packit |
1fb8d4 |
* After CloseHandle on client end
|
|
Packit |
1fb8d4 |
* ReadFile/WriteFile must fail on server end
|
|
Packit |
1fb8d4 |
*/
|
|
Packit |
1fb8d4 |
i = numPipes - 1;
|
|
Packit |
1fb8d4 |
CloseHandle(clients[i]);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (ReadFile(servers[i], rcvbuf, sizeof(rcvbuf), &dwRead, NULL))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Error ReadFile on server end should have failed after CloseHandle on client\n",
|
|
Packit Service |
5a9772 |
__FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (WriteFile(servers[i], sndbuf, sizeof(sndbuf), &dwWritten, NULL))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("%s: Error WriteFile on server end should have failed after CloseHandle on client\n",
|
|
Packit Service |
5a9772 |
__FUNCTION__);
|
|
Packit |
1fb8d4 |
goto out;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
DisconnectNamedPipe(servers[i]);
|
|
Packit |
1fb8d4 |
CloseHandle(servers[i]);
|
|
Packit |
1fb8d4 |
numPipes--;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Close all remaining pipes */
|
|
Packit |
1fb8d4 |
for (i = 0; i < numPipes; i++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
DisconnectNamedPipe(servers[i]);
|
|
Packit |
1fb8d4 |
CloseHandle(servers[i]);
|
|
Packit |
1fb8d4 |
CloseHandle(clients[i]);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
bSuccess = TRUE;
|
|
Packit |
1fb8d4 |
out:
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!bSuccess)
|
|
Packit |
1fb8d4 |
testFailed = TRUE;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
return 0;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
int TestPipeCreateNamedPipe(int argc, char* argv[])
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
HANDLE SingleThread;
|
|
Packit |
1fb8d4 |
HANDLE ClientThread;
|
|
Packit |
1fb8d4 |
HANDLE ServerThread;
|
|
Packit |
1fb8d4 |
HANDLE hPipe;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Verify that CreateNamedPipe returns INVALID_HANDLE_VALUE on failure */
|
|
Packit |
1fb8d4 |
hPipe = CreateNamedPipeA(NULL, 0, 0, 0, 0, 0, 0, NULL);
|
|
Packit |
1fb8d4 |
if (hPipe != INVALID_HANDLE_VALUE)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
printf("CreateNamedPipe unexpectedly returned %p instead of INVALID_HANDLE_VALUE (%p)\n",
|
|
Packit Service |
5a9772 |
hPipe, INVALID_HANDLE_VALUE);
|
|
Packit |
1fb8d4 |
return -1;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef _WIN32
|
|
Packit |
1fb8d4 |
signal(SIGPIPE, SIG_IGN);
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
if (!(ReadyEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("CreateEvent failure: (%" PRIu32 ")\n", GetLastError());
|
|
Packit |
1fb8d4 |
return -1;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
if (!(SingleThread = CreateThread(NULL, 0, named_pipe_single_thread, NULL, 0, NULL)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("CreateThread (SingleThread) failure: (%" PRIu32 ")\n", GetLastError());
|
|
Packit |
1fb8d4 |
return -1;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
if (!(ClientThread = CreateThread(NULL, 0, named_pipe_client_thread, NULL, 0, NULL)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("CreateThread (ClientThread) failure: (%" PRIu32 ")\n", GetLastError());
|
|
Packit |
1fb8d4 |
return -1;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
if (!(ServerThread = CreateThread(NULL, 0, named_pipe_server_thread, NULL, 0, NULL)))
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
printf("CreateThread (ServerThread) failure: (%" PRIu32 ")\n", GetLastError());
|
|
Packit |
1fb8d4 |
return -1;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
WaitForSingleObject(SingleThread, INFINITE);
|
|
Packit |
1fb8d4 |
WaitForSingleObject(ClientThread, INFINITE);
|
|
Packit |
1fb8d4 |
WaitForSingleObject(ServerThread, INFINITE);
|
|
Packit |
1fb8d4 |
CloseHandle(SingleThread);
|
|
Packit |
1fb8d4 |
CloseHandle(ClientThread);
|
|
Packit |
1fb8d4 |
CloseHandle(ServerThread);
|
|
Packit |
1fb8d4 |
return testFailed;
|
|
Packit |
1fb8d4 |
}
|