2002-09-08 10:23:54 +00:00
|
|
|
/* $Id: pipe.c,v 1.7 2002/09/08 10:22:42 chorns Exp $
|
2000-06-03 14:47:33 +00:00
|
|
|
*
|
1999-04-14 00:52:19 +00:00
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS system libraries
|
|
|
|
* FILE: lib/kernel32/file/create.c
|
|
|
|
* PURPOSE: Directory functions
|
|
|
|
* PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
|
|
|
|
* UPDATE HISTORY:
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES *****************************************************************/
|
|
|
|
|
2002-09-08 10:23:54 +00:00
|
|
|
#include <ddk/ntddk.h>
|
2000-09-27 01:24:37 +00:00
|
|
|
#include <kernel32/error.h>
|
1999-04-14 00:52:19 +00:00
|
|
|
|
|
|
|
#include <kernel32/kernel32.h>
|
|
|
|
|
2000-09-27 01:24:37 +00:00
|
|
|
/* GLOBALS ******************************************************************/
|
|
|
|
|
|
|
|
ULONG ProcessPipeId = 0;
|
|
|
|
|
1999-04-14 00:52:19 +00:00
|
|
|
/* FUNCTIONS ****************************************************************/
|
|
|
|
|
|
|
|
BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
|
|
|
|
PHANDLE hWritePipe,
|
|
|
|
LPSECURITY_ATTRIBUTES lpPipeAttributes,
|
|
|
|
DWORD nSize)
|
|
|
|
{
|
2000-09-27 01:24:37 +00:00
|
|
|
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);
|
2002-05-07 22:22:28 +00:00
|
|
|
if (lpPipeAttributes)
|
|
|
|
{
|
|
|
|
if(lpPipeAttributes->bInheritHandle)
|
|
|
|
ObjectAttributes.Attributes |= OBJ_INHERIT;
|
|
|
|
if (lpPipeAttributes->lpSecurityDescriptor)
|
|
|
|
ObjectAttributes.SecurityDescriptor = lpPipeAttributes->lpSecurityDescriptor;
|
|
|
|
}
|
2000-09-27 01:24:37 +00:00
|
|
|
|
|
|
|
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;
|
1999-04-14 00:52:19 +00:00
|
|
|
}
|
2000-06-03 14:47:33 +00:00
|
|
|
|
|
|
|
/* EOF */
|