|
|
1.1 root 1: /****************************** Module Header ******************************\
2: * Module Name: pipe.c
3: *
4: * Copyright (c) 1991, Microsoft Corporation
5: *
6: * This module implements a version of CreatePipe that allows
7: * control over the file flags. e.g. FILE_FLAG_OVERLAPPED
8: *
9: * History:
10: * 06-29-92 Davidc Created.
11: \***************************************************************************/
12:
13: #include "rcmdsrv.h"
14:
15:
16: ULONG PipeSerialNumber = 0;
17:
18: #define PIPE_FORMAT_STRING "\\\\.\\pipe\\rshsrv\\%08x.%08x"
19:
20:
21:
22: /////////////////////////////////////////////////////////////////////////////
23: //
24: // MyCreatePipe
25: //
26: // Creates a uni-directional pipe with the specified security attributes,
27: // size and timeout. The handles are opened with the specified file-flags
28: // so FILE_FLAG_OVERLAPPED etc. can be specified.
29: //
30: // Returns handles to both end of pipe in passed parameters.
31: //
32: // Returns TRUE on success, FALSE on failure. (GetLastError() for details)
33: //
34: /////////////////////////////////////////////////////////////////////////////
35:
36: BOOL
37: MyCreatePipe(
38: LPHANDLE ReadHandle,
39: LPHANDLE WriteHandle,
40: LPSECURITY_ATTRIBUTES SecurityAttributes,
41: DWORD Size,
42: DWORD Timeout,
43: DWORD ReadHandleFlags,
44: DWORD WriteHandleFlags
45: )
46: {
47: CHAR PipeName[MAX_PATH];
48:
49: //
50: // Make up a random pipe name
51: //
52:
53: sprintf(PipeName, PIPE_FORMAT_STRING, GetCurrentProcessId(), PipeSerialNumber++);
54:
55:
56: //
57: // Create the pipe
58: //
59:
60: *ReadHandle = CreateNamedPipeA(
61: PipeName,
62: PIPE_ACCESS_INBOUND | ReadHandleFlags,
63: PIPE_TYPE_BYTE | PIPE_WAIT,
64: 1, // Number of pipes
65: Size, // Out buffer size
66: Size, // In buffer size
67: Timeout, // Timeout in ms
68: SecurityAttributes
69: );
70:
71: if (*ReadHandle == NULL) {
72: DbgPrint("MyCreatePipe: failed to created pipe <%s>, error = %d\n", PipeName, GetLastError());
73: return(FALSE);
74: }
75:
76: //
77: // Open the client end of the pipe
78: //
79:
80:
81: *WriteHandle = CreateFileA(
82: PipeName,
83: GENERIC_WRITE,
84: 0, // No sharing
85: SecurityAttributes,
86: OPEN_EXISTING,
87: FILE_ATTRIBUTE_NORMAL | WriteHandleFlags,
88: NULL // Template file
89: );
90:
91: if (*WriteHandle == INVALID_HANDLE_VALUE ) {
92: DbgPrint("Failed to open client end of pipe <%s>, error = %d\n", PipeName, GetLastError());
93: MyCloseHandle(*ReadHandle, "async pipe (server(read) side)");
94: return(FALSE);
95: }
96:
97:
98: //
99: // Everything succeeded
100: //
101:
102: return(TRUE);
103: }
104:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.