diff --git a/reactos/include/ndk/iotypes.h b/reactos/include/ndk/iotypes.h index cc65d250658..4d81595f1e2 100644 --- a/reactos/include/ndk/iotypes.h +++ b/reactos/include/ndk/iotypes.h @@ -37,6 +37,7 @@ extern POBJECT_TYPE NTSYSAPI IoDriverObjectType; #define FILE_DOES_NOT_EXIST 0x00000005 /* Pipe Flags */ +#define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000 #define FILE_PIPE_BYTE_STREAM_MODE 0x00000000 #define FILE_PIPE_MESSAGE_MODE 0x00000001 #define FILE_PIPE_QUEUE_OPERATION 0x00000000 diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 5c52c231a0b..5ec42c44a95 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -1181,6 +1181,15 @@ RtlIsTextUnicode( ULONG *Flags ); +NTSYSAPI +BOOLEAN +NTAPI +RtlPrefixString( + PCANSI_STRING String1, + PCANSI_STRING String2, + BOOLEAN CaseInsensitive +); + NTSYSAPI BOOLEAN NTAPI diff --git a/reactos/lib/kernel32/file/pipe.c b/reactos/lib/kernel32/file/pipe.c index dc23507a0ad..b53ea14a9ef 100644 --- a/reactos/lib/kernel32/file/pipe.c +++ b/reactos/lib/kernel32/file/pipe.c @@ -17,95 +17,109 @@ /* GLOBALS ******************************************************************/ -ULONG ProcessPipeId = 0; +LONG ProcessPipeId = 0; /* FUNCTIONS ****************************************************************/ /* * @implemented */ -BOOL STDCALL CreatePipe(PHANDLE hReadPipe, - PHANDLE hWritePipe, - LPSECURITY_ATTRIBUTES lpPipeAttributes, - DWORD nSize) +BOOL +STDCALL +CreatePipe(PHANDLE hReadPipe, + PHANDLE hWritePipe, + LPSECURITY_ATTRIBUTES lpPipeAttributes, + DWORD nSize) { - WCHAR Buffer[64]; - UNICODE_STRING PipeName; - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK StatusBlock; - LARGE_INTEGER DefaultTimeout; - NTSTATUS Status; - HANDLE ReadPipeHandle; - HANDLE WritePipeHandle; - ULONG PipeId; - ULONG Attributes; - PSECURITY_DESCRIPTOR SecurityDescriptor = NULL; + WCHAR Buffer[64]; + UNICODE_STRING PipeName; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK StatusBlock; + LARGE_INTEGER DefaultTimeout; + NTSTATUS Status; + HANDLE ReadPipeHandle; + HANDLE WritePipeHandle; + LONG PipeId; + ULONG Attributes; + PSECURITY_DESCRIPTOR SecurityDescriptor = NULL; - DefaultTimeout.QuadPart = -300000000; /* 30 seconds */ + /* Set the timeout to 120 seconds */ + DefaultTimeout.QuadPart = -1200000000; - PipeId = (ULONG)InterlockedIncrement((LONG*)&ProcessPipeId); - swprintf(Buffer, - L"\\\\.\\PIPE\\Win32Pipes.%08x.%08x", - NtCurrentTeb()->Cid.UniqueProcess, - PipeId); - RtlInitUnicodeString (&PipeName, - Buffer); + /* Use default buffer size if desired */ + if (!nSize) nSize = 0x1000; - Attributes = OBJ_CASE_INSENSITIVE; - if (lpPipeAttributes) - { - SecurityDescriptor = lpPipeAttributes->lpSecurityDescriptor; - if (lpPipeAttributes->bInheritHandle) - Attributes |= OBJ_INHERIT; - } + /* Increase the Pipe ID */ + PipeId = InterlockedIncrement(&ProcessPipeId); - /* use default buffer size if desired */ - if (nSize == 0) - nSize = 0x1000; + /* Create the pipe name */ + swprintf(Buffer, + L"\\\\.\\PIPE\\Win32Pipes.%08x.%08x", + NtCurrentTeb()->Cid.UniqueProcess, + PipeId); + RtlInitUnicodeString(&PipeName, Buffer); - InitializeObjectAttributes(&ObjectAttributes, - &PipeName, - Attributes, - NULL, - SecurityDescriptor); + /* Always use case insensitive */ + Attributes = OBJ_CASE_INSENSITIVE; - Status = NtCreateNamedPipeFile(&ReadPipeHandle, - FILE_GENERIC_READ |FILE_WRITE_ATTRIBUTES | SYNCHRONIZE, - &ObjectAttributes, - &StatusBlock, - FILE_SHARE_WRITE, - FILE_CREATE, - FILE_SYNCHRONOUS_IO_NONALERT, - FALSE, - FALSE, - FALSE, - 1, - nSize, - nSize, - &DefaultTimeout); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - return FALSE; - } + /* Check if we got attributes */ + if (lpPipeAttributes) + { + /* Use the attributes' SD instead */ + SecurityDescriptor = lpPipeAttributes->lpSecurityDescriptor; - Status = NtOpenFile(&WritePipeHandle, - FILE_GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &StatusBlock, - FILE_SHARE_READ, - FILE_SYNCHRONOUS_IO_NONALERT); - if (!NT_SUCCESS(Status)) - { - NtClose(ReadPipeHandle); - SetLastErrorByStatus(Status); - return FALSE; - } + /* Set OBJ_INHERIT if requested */ + if (lpPipeAttributes->bInheritHandle) Attributes |= OBJ_INHERIT; + } - *hReadPipe = ReadPipeHandle; - *hWritePipe = WritePipeHandle; + /* Initialize the attributes */ + InitializeObjectAttributes(&ObjectAttributes, + &PipeName, + Attributes, + NULL, + SecurityDescriptor); - return TRUE; + /* Create the named pipe */ + Status = NtCreateNamedPipeFile(&ReadPipeHandle, + FILE_GENERIC_READ |FILE_WRITE_ATTRIBUTES | SYNCHRONIZE, + &ObjectAttributes, + &StatusBlock, + FILE_SHARE_WRITE, + FILE_CREATE, + FILE_SYNCHRONOUS_IO_NONALERT, + FILE_PIPE_BYTE_STREAM_TYPE, + FILE_PIPE_BYTE_STREAM_MODE, + FILE_PIPE_BYTE_STREAM_MODE, + 1, + nSize, + nSize, + &DefaultTimeout); + if (!NT_SUCCESS(Status)) + { + /* Convert error and fail */ + SetLastErrorByStatus(Status); + return FALSE; + } + + /* Now try opening it for write access */ + Status = NtOpenFile(&WritePipeHandle, + FILE_GENERIC_WRITE | SYNCHRONIZE, + &ObjectAttributes, + &StatusBlock, + FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); + if (!NT_SUCCESS(Status)) + { + /* Convert error and fail */ + NtClose(ReadPipeHandle); + SetLastErrorByStatus(Status); + return FALSE; + } + + /* Return both handles */ + *hReadPipe = ReadPipeHandle; + *hWritePipe = WritePipeHandle; + return TRUE; } /* EOF */