home *** CD-ROM | disk | FTP | other *** search
-
- /******************************************************************************\
- * 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 );
- }
-