|
|
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.