Use the share disposition to detect the direction of a pipe. Modified: trunk/reactos/drivers/fs/np/create.c Modified: trunk/reactos/lib/kernel32/file/npipe.c Modified: trunk/reactos/lib/kernel32/file/pipe.c _____
Modified: trunk/reactos/drivers/fs/np/create.c --- trunk/reactos/drivers/fs/np/create.c 2005-11-05 21:28:27 UTC (rev 19020) +++ trunk/reactos/drivers/fs/np/create.c 2005-11-05 22:03:47 UTC (rev 19021) @@ -329,6 +329,14 @@
Irp->IoStatus.Information = 0;
+ if (!(IoStack->Parameters.CreatePipe.ShareAccess & (FILE_SHARE_READ|FILE_SHARE_WRITE)) || + (IoStack->Parameters.CreatePipe.ShareAccess & ~(FILE_SHARE_READ|FILE_SHARE_WRITE))) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_INVALID_PARAMETER; + } + Fcb = ExAllocatePool(NonPagedPool, sizeof(NPFS_FCB)); if (Fcb == NULL) { @@ -411,12 +419,23 @@ Pipe->WriteMode = Buffer->ReadMode; Pipe->ReadMode = Buffer->ReadMode; Pipe->CompletionMode = Buffer->CompletionMode; - Pipe->PipeConfiguration = IoStack->Parameters.CreatePipe.Options & 0x3; + switch (IoStack->Parameters.CreatePipe.ShareAccess & (FILE_SHARE_READ|FILE_SHARE_WRITE)) + { + case FILE_SHARE_READ: + Pipe->PipeConfiguration = FILE_PIPE_OUTBOUND; + break; + case FILE_SHARE_WRITE: + Pipe->PipeConfiguration = FILE_PIPE_INBOUND; + break; + case FILE_SHARE_READ|FILE_SHARE_WRITE: + Pipe->PipeConfiguration = FILE_PIPE_FULL_DUPLEX; + break; + } Pipe->MaximumInstances = Buffer->MaximumInstances; Pipe->CurrentInstances = 0; Pipe->TimeOut = Buffer->DefaultTimeout; - if (!(IoStack->Parameters.CreatePipe.Options & FILE_PIPE_OUTBOUND) || - IoStack->Parameters.CreatePipe.Options & FILE_PIPE_FULL_DUPLEX) + if (!(Pipe->PipeConfiguration & FILE_PIPE_OUTBOUND) || + Pipe->PipeConfiguration & FILE_PIPE_FULL_DUPLEX) { if (Buffer->InboundQuota == 0) { @@ -440,7 +459,7 @@ Pipe->InboundQuota = 0; }
- if (IoStack->Parameters.CreatePipe.Options & (FILE_PIPE_FULL_DUPLEX|FILE_PIPE_OUTBOUND)) + if (Pipe->PipeConfiguration & (FILE_PIPE_FULL_DUPLEX|FILE_PIPE_OUTBOUND)) { if (Buffer->OutboundQuota == 0) { _____
Modified: trunk/reactos/lib/kernel32/file/npipe.c --- trunk/reactos/lib/kernel32/file/npipe.c 2005-11-05 21:28:27 UTC (rev 19020) +++ trunk/reactos/lib/kernel32/file/npipe.c 2005-11-05 22:03:47 UTC (rev 19021) @@ -123,27 +123,16 @@
if (!(dwOpenMode & FILE_FLAG_OVERLAPPED)) CreateOptions = CreateOptions | FILE_SYNCHRONOUS_IO_NONALERT;
- switch (dwOpenMode & PIPE_ACCESS_DUPLEX) - { - case PIPE_ACCESS_INBOUND: - CreateOptions |= FILE_PIPE_INBOUND; - ShareAccess |= FILE_SHARE_WRITE; - DesiredAccess |= GENERIC_READ; - break; - - case PIPE_ACCESS_OUTBOUND: - CreateOptions |= FILE_PIPE_OUTBOUND; - ShareAccess |= FILE_SHARE_READ; - DesiredAccess |= GENERIC_WRITE; - break; - - case PIPE_ACCESS_DUPLEX: - CreateOptions |= FILE_PIPE_FULL_DUPLEX; - ShareAccess |= (FILE_SHARE_READ | FILE_SHARE_WRITE); - DesiredAccess |= (GENERIC_READ | GENERIC_WRITE); - break; - } - + if (dwOpenMode & PIPE_ACCESS_OUTBOUND) + { + ShareAccess |= FILE_SHARE_READ; + DesiredAccess |= GENERIC_WRITE; + } + if (dwOpenMode & PIPE_ACCESS_INBOUND) + { + ShareAccess |= FILE_SHARE_WRITE; + DesiredAccess |= GENERIC_READ; + } if (dwPipeMode & PIPE_TYPE_MESSAGE) WriteModeMessage = FILE_PIPE_MESSAGE_MODE; else _____
Modified: trunk/reactos/lib/kernel32/file/pipe.c --- trunk/reactos/lib/kernel32/file/pipe.c 2005-11-05 21:28:27 UTC (rev 19020) +++ trunk/reactos/lib/kernel32/file/pipe.c 2005-11-05 22:03:47 UTC (rev 19021) @@ -41,11 +41,11 @@
ULONG Attributes; PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
- DefaultTimeout.QuadPart = 300000000; /* 30 seconds */ + DefaultTimeout.QuadPart = -300000000; /* 30 seconds */
PipeId = (ULONG)InterlockedIncrement((LONG*)&ProcessPipeId); swprintf(Buffer, - L"\Device\NamedPipe\Win32Pipes.%08x.%08x", + L"\\.\PIPE\Win32Pipes.%08x.%08x", NtCurrentTeb()->Cid.UniqueProcess, PipeId); RtlInitUnicodeString (&PipeName, @@ -73,7 +73,7 @@ FILE_GENERIC_READ |FILE_WRITE_ATTRIBUTES | SYNCHRONIZE, &ObjectAttributes, &StatusBlock, - FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SHARE_WRITE, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, FALSE, @@ -93,8 +93,8 @@ FILE_GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &StatusBlock, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); + FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT); if (!NT_SUCCESS(Status)) { NtClose(ReadPipeHandle);