157 lines
4.5 KiB
C
157 lines
4.5 KiB
C
|
|
||
|
/******************************************************************************\
|
||
|
* This is a part of the Microsoft Source Code Samples.
|
||
|
* Copyright 1995 - 1997 Microsoft Corporation.
|
||
|
* All rights reserved.
|
||
|
* This source code is only intended as a supplement to
|
||
|
* Microsoft Development Tools and/or WinHelp documentation.
|
||
|
* See these sources for detailed information regarding the
|
||
|
* Microsoft samples programs.
|
||
|
\******************************************************************************/
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Copyright (c) 1997 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
pipeex.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
CreatePipe-like function that lets one or both handles be overlapped
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Dave Hart Summer 1997
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
ULONG PipeSerialNumber;
|
||
|
|
||
|
BOOL
|
||
|
APIENTRY
|
||
|
MyCreatePipeEx(
|
||
|
OUT LPHANDLE lpReadPipe,
|
||
|
OUT LPHANDLE lpWritePipe,
|
||
|
IN LPSECURITY_ATTRIBUTES lpPipeAttributes,
|
||
|
IN DWORD nSize,
|
||
|
DWORD dwReadMode,
|
||
|
DWORD dwWriteMode
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
The CreatePipeEx API is used to create an anonymous pipe I/O device.
|
||
|
Unlike CreatePipe FILE_FLAG_OVERLAPPED may be specified for one or
|
||
|
both handles.
|
||
|
Two handles to the device are created. One handle is opened for
|
||
|
reading and the other is opened for writing. These handles may be
|
||
|
used in subsequent calls to ReadFile and WriteFile to transmit data
|
||
|
through the pipe.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
lpReadPipe - Returns a handle to the read side of the pipe. Data
|
||
|
may be read from the pipe by specifying this handle value in a
|
||
|
subsequent call to ReadFile.
|
||
|
|
||
|
lpWritePipe - Returns a handle to the write side of the pipe. Data
|
||
|
may be written to the pipe by specifying this handle value in a
|
||
|
subsequent call to WriteFile.
|
||
|
|
||
|
lpPipeAttributes - An optional parameter that may be used to specify
|
||
|
the attributes of the new pipe. If the parameter is not
|
||
|
specified, then the pipe is created without a security
|
||
|
descriptor, and the resulting handles are not inherited on
|
||
|
process creation. Otherwise, the optional security attributes
|
||
|
are used on the pipe, and the inherit handles flag effects both
|
||
|
pipe handles.
|
||
|
|
||
|
nSize - Supplies the requested buffer size for the pipe. This is
|
||
|
only a suggestion and is used by the operating system to
|
||
|
calculate an appropriate buffering mechanism. A value of zero
|
||
|
indicates that the system is to choose the default buffering
|
||
|
scheme.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE - The operation was successful.
|
||
|
|
||
|
FALSE/NULL - The operation failed. Extended error status is available
|
||
|
using GetLastError.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
HANDLE ReadPipeHandle, WritePipeHandle;
|
||
|
DWORD dwError;
|
||
|
UCHAR PipeNameBuffer[ MAX_PATH ];
|
||
|
|
||
|
//
|
||
|
// Only one valid OpenMode flag - FILE_FLAG_OVERLAPPED
|
||
|
//
|
||
|
|
||
|
if ((dwReadMode | dwWriteMode) & (~FILE_FLAG_OVERLAPPED)) {
|
||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set the default timeout to 120 seconds
|
||
|
//
|
||
|
|
||
|
if (nSize == 0) {
|
||
|
nSize = 4096;
|
||
|
}
|
||
|
|
||
|
sprintf( PipeNameBuffer,
|
||
|
"\\\\.\\Pipe\\RemoteExeAnon.%08x.%08x",
|
||
|
GetCurrentProcessId(),
|
||
|
PipeSerialNumber++
|
||
|
);
|
||
|
|
||
|
ReadPipeHandle = CreateNamedPipeA(
|
||
|
PipeNameBuffer,
|
||
|
PIPE_ACCESS_INBOUND | dwReadMode,
|
||
|
PIPE_TYPE_BYTE | PIPE_WAIT,
|
||
|
1, // Number of pipes
|
||
|
nSize, // Out buffer size
|
||
|
nSize, // In buffer size
|
||
|
120 * 1000, // Timeout in ms
|
||
|
lpPipeAttributes
|
||
|
);
|
||
|
|
||
|
if (! ReadPipeHandle) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
WritePipeHandle = CreateFileA(
|
||
|
PipeNameBuffer,
|
||
|
GENERIC_WRITE,
|
||
|
0, // No sharing
|
||
|
lpPipeAttributes,
|
||
|
OPEN_EXISTING,
|
||
|
FILE_ATTRIBUTE_NORMAL | dwWriteMode,
|
||
|
NULL // Template file
|
||
|
);
|
||
|
|
||
|
if (INVALID_HANDLE_VALUE == WritePipeHandle) {
|
||
|
dwError = GetLastError();
|
||
|
CloseHandle( ReadPipeHandle );
|
||
|
SetLastError(dwError);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
*lpReadPipe = ReadPipeHandle;
|
||
|
*lpWritePipe = WritePipeHandle;
|
||
|
return( TRUE );
|
||
|
}
|