- Use ShareAccess FILE_SHARE_READ | FILE_SHARE_WRITE to indicate passive mode for client end pipes.

svn path=/trunk/; revision=12406
This commit is contained in:
Eric Kohl 2004-12-30 16:15:46 +00:00
parent 78c79c31e7
commit 216311551a
3 changed files with 139 additions and 120 deletions

View file

@ -1,4 +1,4 @@
/* $Id: create.c,v 1.27 2004/12/30 12:34:26 ekohl Exp $
/* $Id: create.c,v 1.28 2004/12/30 16:15:10 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -76,20 +76,20 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
PNPFS_FCB ClientFcb;
PNPFS_FCB ServerFcb = NULL;
PNPFS_DEVICE_EXTENSION DeviceExt;
ULONG Disposition;
BOOLEAN SpecialAccess;
DPRINT("NpfsCreate(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
IoStack = IoGetCurrentIrpStackLocation(Irp);
FileObject = IoStack->FileObject;
Disposition = ((IoStack->Parameters.Create.Options >> 24) & 0xff);
DPRINT("FileObject %p\n", FileObject);
DPRINT("FileName %wZ\n", &FileObject->FileName);
Irp->IoStatus.Information = 0;
if (Disposition & FILE_OPEN)
SpecialAccess = ((IoStack->Parameters.Create.ShareAccess & 3) == 3);
if (SpecialAccess)
{
DPRINT("NpfsCreate() open client end for special use!\n");
}
@ -122,7 +122,7 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
*/
KeLockMutex(&Pipe->FcbListLock);
if (!(Disposition & FILE_OPEN))
if (!SpecialAccess)
{
ServerFcb = NpfsFindListeningServerInstance(Pipe);
if (ServerFcb == NULL)
@ -160,7 +160,7 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
ClientFcb->Pipe = Pipe;
ClientFcb->PipeEnd = FILE_PIPE_CLIENT_END;
ClientFcb->OtherSide = NULL;
ClientFcb->PipeState = (Disposition & FILE_OPEN) ? 0 : FILE_PIPE_DISCONNECTED_STATE;
ClientFcb->PipeState = SpecialAccess ? 0 : FILE_PIPE_DISCONNECTED_STATE;
/* Initialize data list. */
if (Pipe->InboundQuota)

View file

@ -1,4 +1,4 @@
/* $Id: rw.c,v 1.15 2004/05/10 19:58:10 navaraf Exp $
/* $Id: rw.c,v 1.16 2004/12/30 16:15:10 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -16,6 +16,8 @@
#define NDEBUG
#include <debug.h>
#define FIN_WORKAROUND_READCLOSE
/* FUNCTIONS *****************************************************************/
#ifndef NDEBUG
@ -46,8 +48,10 @@ VOID HexDump(PUCHAR Buffer, ULONG Length)
}
#endif
NTSTATUS STDCALL
NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
NpfsRead(PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
PIO_STACK_LOCATION IoStack;
PFILE_OBJECT FileObject;
@ -132,12 +136,14 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Status = STATUS_SUCCESS;
goto done;
}
if (Fcb->PipeState != FILE_PIPE_CONNECTED_STATE)
{
DPRINT("PipeState: %x\n", Fcb->PipeState);
Status = STATUS_PIPE_BROKEN;
goto done;
}
/* Wait for ReadEvent to become signaled */
DPRINT("Waiting for readable data (%S)\n", Pipe->PipeName.Buffer);
Status = KeWaitForSingleObject(&Fcb->Event,
@ -146,6 +152,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
FALSE,
NULL);
DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status);
#ifndef FIN_WORKAROUND_READCLOSE
/*
* It's possible that the event was signaled because the
@ -219,6 +226,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
ReadFcb->ReadDataAvailable = 0;
ReadFcb->WriteQuotaAvailable = ReadFcb->MaxDataLength;
}
if (Information > 0)
{
KeSetEvent(&ReadFcb->Event, IO_NO_INCREMENT, FALSE);
@ -235,6 +243,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
}
#endif
}
KeReleaseSpinLock(&ReadFcb->DataListLock, OldIrql);
done:
@ -243,7 +252,9 @@ done:
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(Status);
DPRINT("NpfsRead done (Status %lx)\n", Status);
return Status;
}
@ -328,6 +339,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
Status = STATUS_PIPE_BROKEN;
goto done;
}
DPRINT("Waiting for buffer space (%S)\n", Pipe->PipeName.Buffer);
Status = KeWaitForSingleObject(&Fcb->Event,
UserRequest,
@ -335,6 +347,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
FALSE,
NULL);
DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status);
#ifndef FIN_WORKAROUND_READCLOSE
/*
* It's possible that the event was signaled because the
@ -349,6 +362,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
#endif
KeAcquireSpinLock(&Fcb->DataListLock, &OldIrql);
}
if (Pipe->PipeWriteMode == FILE_PIPE_BYTE_STREAM_MODE)
{
DPRINT("Byte stream mode\n");
@ -388,6 +402,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
}
else
{
DPRINT("Message mode\n");
if (Length > 0)
{
CopyLength = RtlRosMin(Length, Fcb->WriteQuotaAvailable);
@ -397,6 +412,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
Fcb->ReadDataAvailable = CopyLength;
Fcb->WriteQuotaAvailable = 0;
}
if (Information > 0)
{
KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE);
@ -404,6 +420,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
}
}
}
KeReleaseSpinLock(&Fcb->DataListLock, OldIrql);
done:
@ -412,7 +429,9 @@ done:
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(Status);
DPRINT("NpfsWrite done (Status %lx)\n", Status);
return Status;
}
/* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: npipe.c,v 1.21 2004/12/23 20:13:19 ekohl Exp $
/* $Id: npipe.c,v 1.22 2004/12/30 16:15:46 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
@ -262,8 +262,8 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
FILE_GENERIC_READ,
&ObjectAttributes,
&Iosb,
0,
FILE_SYNCHRONOUS_IO_ALERT);
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus (Status);