--- trunk/reactos/lib/kernel32/file/pipe.c 2005-11-08 20:50:04 UTC (rev 19064)
+++ trunk/reactos/lib/kernel32/file/pipe.c 2005-11-08 20:53:53 UTC (rev 19065)
@@ -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 */