From bd6afcb8baee8e3a4d7111069c5251fb5f51d117 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 27 Sep 2000 01:24:37 +0000 Subject: [PATCH] Implemented CreatePipe() svn path=/trunk/; revision=1372 --- reactos/lib/kernel32/file/pipe.c | 80 +++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 6 deletions(-) diff --git a/reactos/lib/kernel32/file/pipe.c b/reactos/lib/kernel32/file/pipe.c index c537eba0c2f..3270f590616 100644 --- a/reactos/lib/kernel32/file/pipe.c +++ b/reactos/lib/kernel32/file/pipe.c @@ -1,4 +1,4 @@ -/* $Id: pipe.c,v 1.3 2000/06/03 14:47:32 ea Exp $ +/* $Id: pipe.c,v 1.4 2000/09/27 01:24:37 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -11,12 +11,14 @@ /* INCLUDES *****************************************************************/ #include -#include -#include -#include +#include #include +/* GLOBALS ******************************************************************/ + +ULONG ProcessPipeId = 0; + /* FUNCTIONS ****************************************************************/ BOOL STDCALL CreatePipe(PHANDLE hReadPipe, @@ -24,8 +26,74 @@ BOOL STDCALL CreatePipe(PHANDLE hReadPipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize) { - DPRINT("CreatePipe is unimplemented\n"); - return(FALSE); + WCHAR Buffer[64]; + UNICODE_STRING PipeName; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK StatusBlock; + LARGE_INTEGER DefaultTimeout; + NTSTATUS Status; + HANDLE ReadPipeHandle; + HANDLE WritePipeHandle; + PSECURITY_DESCRIPTOR SecurityDescriptor = NULL; + + DefaultTimeout.QuadPart = 300000000; /* 30 seconds */ + + ProcessPipeId++; + swprintf(Buffer, + L"\\Device\\NamedPipe\\Win32Pipes.%08x.%08x", + NtCurrentTeb()->Cid.UniqueProcess, + ProcessPipeId); + RtlInitUnicodeString (&PipeName, + Buffer); + + if (lpPipeAttributes) + { + SecurityDescriptor = lpPipeAttributes->lpSecurityDescriptor; + } + + InitializeObjectAttributes(&ObjectAttributes, + &PipeName, + OBJ_CASE_INSENSITIVE, + NULL, + SecurityDescriptor); + + Status = NtCreateNamedPipeFile(&ReadPipeHandle, + FILE_GENERIC_READ, + &ObjectAttributes, + &StatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_CREATE, + FILE_SYNCHRONOUS_IO_NONALERT, + FALSE, + FALSE, + FALSE, + 1, + nSize, + nSize, + &DefaultTimeout); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + Status = NtOpenFile(&WritePipeHandle, + FILE_GENERIC_WRITE, + &ObjectAttributes, + &StatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); + if (!NT_SUCCESS(Status)) + { + NtClose(ReadPipeHandle); + SetLastErrorByStatus(Status); + return FALSE; + } + + *hReadPipe = ReadPipeHandle; + *hWritePipe = WritePipeHandle; + + return TRUE; } /* EOF */