mirror of
https://github.com/reactos/reactos.git
synced 2024-08-01 09:01:13 +00:00
- 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:
parent
78c79c31e7
commit
216311551a
|
@ -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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -76,20 +76,20 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
|
||||||
PNPFS_FCB ClientFcb;
|
PNPFS_FCB ClientFcb;
|
||||||
PNPFS_FCB ServerFcb = NULL;
|
PNPFS_FCB ServerFcb = NULL;
|
||||||
PNPFS_DEVICE_EXTENSION DeviceExt;
|
PNPFS_DEVICE_EXTENSION DeviceExt;
|
||||||
ULONG Disposition;
|
BOOLEAN SpecialAccess;
|
||||||
|
|
||||||
DPRINT("NpfsCreate(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
|
DPRINT("NpfsCreate(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
|
||||||
|
|
||||||
DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
FileObject = IoStack->FileObject;
|
FileObject = IoStack->FileObject;
|
||||||
Disposition = ((IoStack->Parameters.Create.Options >> 24) & 0xff);
|
|
||||||
DPRINT("FileObject %p\n", FileObject);
|
DPRINT("FileObject %p\n", FileObject);
|
||||||
DPRINT("FileName %wZ\n", &FileObject->FileName);
|
DPRINT("FileName %wZ\n", &FileObject->FileName);
|
||||||
|
|
||||||
Irp->IoStatus.Information = 0;
|
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");
|
DPRINT("NpfsCreate() open client end for special use!\n");
|
||||||
}
|
}
|
||||||
|
@ -122,7 +122,7 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
|
||||||
*/
|
*/
|
||||||
KeLockMutex(&Pipe->FcbListLock);
|
KeLockMutex(&Pipe->FcbListLock);
|
||||||
|
|
||||||
if (!(Disposition & FILE_OPEN))
|
if (!SpecialAccess)
|
||||||
{
|
{
|
||||||
ServerFcb = NpfsFindListeningServerInstance(Pipe);
|
ServerFcb = NpfsFindListeningServerInstance(Pipe);
|
||||||
if (ServerFcb == NULL)
|
if (ServerFcb == NULL)
|
||||||
|
@ -160,7 +160,7 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
|
||||||
ClientFcb->Pipe = Pipe;
|
ClientFcb->Pipe = Pipe;
|
||||||
ClientFcb->PipeEnd = FILE_PIPE_CLIENT_END;
|
ClientFcb->PipeEnd = FILE_PIPE_CLIENT_END;
|
||||||
ClientFcb->OtherSide = NULL;
|
ClientFcb->OtherSide = NULL;
|
||||||
ClientFcb->PipeState = (Disposition & FILE_OPEN) ? 0 : FILE_PIPE_DISCONNECTED_STATE;
|
ClientFcb->PipeState = SpecialAccess ? 0 : FILE_PIPE_DISCONNECTED_STATE;
|
||||||
|
|
||||||
/* Initialize data list. */
|
/* Initialize data list. */
|
||||||
if (Pipe->InboundQuota)
|
if (Pipe->InboundQuota)
|
||||||
|
|
|
@ -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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -16,6 +16,8 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
#define FIN_WORKAROUND_READCLOSE
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
@ -46,8 +48,10 @@ VOID HexDump(PUCHAR Buffer, ULONG Length)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
NpfsRead(PDEVICE_OBJECT DeviceObject,
|
||||||
|
PIRP Irp)
|
||||||
{
|
{
|
||||||
PIO_STACK_LOCATION IoStack;
|
PIO_STACK_LOCATION IoStack;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
|
@ -132,12 +136,14 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Fcb->PipeState != FILE_PIPE_CONNECTED_STATE)
|
if (Fcb->PipeState != FILE_PIPE_CONNECTED_STATE)
|
||||||
{
|
{
|
||||||
DPRINT("PipeState: %x\n", Fcb->PipeState);
|
DPRINT("PipeState: %x\n", Fcb->PipeState);
|
||||||
Status = STATUS_PIPE_BROKEN;
|
Status = STATUS_PIPE_BROKEN;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for ReadEvent to become signaled */
|
/* Wait for ReadEvent to become signaled */
|
||||||
DPRINT("Waiting for readable data (%S)\n", Pipe->PipeName.Buffer);
|
DPRINT("Waiting for readable data (%S)\n", Pipe->PipeName.Buffer);
|
||||||
Status = KeWaitForSingleObject(&Fcb->Event,
|
Status = KeWaitForSingleObject(&Fcb->Event,
|
||||||
|
@ -146,6 +152,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
FALSE,
|
FALSE,
|
||||||
NULL);
|
NULL);
|
||||||
DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status);
|
DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status);
|
||||||
|
|
||||||
#ifndef FIN_WORKAROUND_READCLOSE
|
#ifndef FIN_WORKAROUND_READCLOSE
|
||||||
/*
|
/*
|
||||||
* It's possible that the event was signaled because the
|
* It's possible that the event was signaled because the
|
||||||
|
@ -219,6 +226,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
ReadFcb->ReadDataAvailable = 0;
|
ReadFcb->ReadDataAvailable = 0;
|
||||||
ReadFcb->WriteQuotaAvailable = ReadFcb->MaxDataLength;
|
ReadFcb->WriteQuotaAvailable = ReadFcb->MaxDataLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Information > 0)
|
if (Information > 0)
|
||||||
{
|
{
|
||||||
KeSetEvent(&ReadFcb->Event, IO_NO_INCREMENT, FALSE);
|
KeSetEvent(&ReadFcb->Event, IO_NO_INCREMENT, FALSE);
|
||||||
|
@ -235,6 +243,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
KeReleaseSpinLock(&ReadFcb->DataListLock, OldIrql);
|
KeReleaseSpinLock(&ReadFcb->DataListLock, OldIrql);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@ -243,7 +252,9 @@ done:
|
||||||
|
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
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;
|
Status = STATUS_PIPE_BROKEN;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINT("Waiting for buffer space (%S)\n", Pipe->PipeName.Buffer);
|
DPRINT("Waiting for buffer space (%S)\n", Pipe->PipeName.Buffer);
|
||||||
Status = KeWaitForSingleObject(&Fcb->Event,
|
Status = KeWaitForSingleObject(&Fcb->Event,
|
||||||
UserRequest,
|
UserRequest,
|
||||||
|
@ -335,6 +347,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
|
||||||
FALSE,
|
FALSE,
|
||||||
NULL);
|
NULL);
|
||||||
DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status);
|
DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status);
|
||||||
|
|
||||||
#ifndef FIN_WORKAROUND_READCLOSE
|
#ifndef FIN_WORKAROUND_READCLOSE
|
||||||
/*
|
/*
|
||||||
* It's possible that the event was signaled because the
|
* It's possible that the event was signaled because the
|
||||||
|
@ -349,6 +362,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
|
||||||
#endif
|
#endif
|
||||||
KeAcquireSpinLock(&Fcb->DataListLock, &OldIrql);
|
KeAcquireSpinLock(&Fcb->DataListLock, &OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Pipe->PipeWriteMode == FILE_PIPE_BYTE_STREAM_MODE)
|
if (Pipe->PipeWriteMode == FILE_PIPE_BYTE_STREAM_MODE)
|
||||||
{
|
{
|
||||||
DPRINT("Byte stream mode\n");
|
DPRINT("Byte stream mode\n");
|
||||||
|
@ -388,6 +402,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
DPRINT("Message mode\n");
|
||||||
if (Length > 0)
|
if (Length > 0)
|
||||||
{
|
{
|
||||||
CopyLength = RtlRosMin(Length, Fcb->WriteQuotaAvailable);
|
CopyLength = RtlRosMin(Length, Fcb->WriteQuotaAvailable);
|
||||||
|
@ -397,6 +412,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
|
||||||
Fcb->ReadDataAvailable = CopyLength;
|
Fcb->ReadDataAvailable = CopyLength;
|
||||||
Fcb->WriteQuotaAvailable = 0;
|
Fcb->WriteQuotaAvailable = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Information > 0)
|
if (Information > 0)
|
||||||
{
|
{
|
||||||
KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE);
|
KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE);
|
||||||
|
@ -404,6 +420,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KeReleaseSpinLock(&Fcb->DataListLock, OldIrql);
|
KeReleaseSpinLock(&Fcb->DataListLock, OldIrql);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@ -412,7 +429,9 @@ done:
|
||||||
|
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
return(Status);
|
DPRINT("NpfsWrite done (Status %lx)\n", Status);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
|
@ -262,8 +262,8 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
|
||||||
FILE_GENERIC_READ,
|
FILE_GENERIC_READ,
|
||||||
&ObjectAttributes,
|
&ObjectAttributes,
|
||||||
&Iosb,
|
&Iosb,
|
||||||
0,
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
FILE_SYNCHRONOUS_IO_ALERT);
|
FILE_SYNCHRONOUS_IO_NONALERT);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
SetLastErrorByStatus (Status);
|
SetLastErrorByStatus (Status);
|
||||||
|
|
Loading…
Reference in a new issue