- create.c: Use new members.
- finfo.c: Check whether the pipe side is server or client and change/return appropriate ReadMode.
- fsctrl.c: Opps. Previous implementation was pretty much correct.
- rw.c: Silence debug message and use new members.
Add multiple checks on whether pipe side is server or client and use appropriate ReadMode.
If handling the next Irp in NpfsRead, remove the cancel routine before continuing the loop. Fixes BugCheck when running ntdll_winetest for file. Thank Christoph von Wittich for pointing this out.
svn path=/trunk/; revision=38986
KeInitializeMutex(&Fcb->CcbListLock, 0);
Fcb->PipeType = Buffer->NamedPipeType;
KeInitializeMutex(&Fcb->CcbListLock, 0);
Fcb->PipeType = Buffer->NamedPipeType;
- /* FIXME: Verify which is correct */
- Fcb->WriteMode = Buffer->ReadMode;//Buffer->NamedPipeType;
+ Fcb->ServerReadMode = Buffer->ReadMode;
/* MSDN documentation reads that clients always start off in byte mode */
/* MSDN documentation reads that clients always start off in byte mode */
- Fcb->ReadMode = FILE_PIPE_BYTE_STREAM_MODE;
+ Fcb->ClientReadMode = FILE_PIPE_BYTE_STREAM_MODE;
Fcb->CompletionMode = Buffer->CompletionMode;
switch (IoStack->Parameters.CreatePipe.ShareAccess & (FILE_SHARE_READ|FILE_SHARE_WRITE))
Fcb->CompletionMode = Buffer->CompletionMode;
switch (IoStack->Parameters.CreatePipe.ShareAccess & (FILE_SHARE_READ|FILE_SHARE_WRITE))
DPRINT("Cannot change readmode to message type on a byte type pipe!\n");
return STATUS_ACCESS_DENIED;
}
DPRINT("Cannot change readmode to message type on a byte type pipe!\n");
return STATUS_ACCESS_DENIED;
}
- Fcb->ReadMode = Request->ReadMode;
+ if (Ccb->PipeEnd == FILE_PIPE_CLIENT_END)
+ {
+ Fcb->ClientReadMode = Request->ReadMode;
+ }
+ else
+ {
+ Fcb->ServerReadMode = Request->ReadMode;
+ }
+
Fcb->CompletionMode = Request->CompletionMode;
/* Return Success */
Fcb->CompletionMode = Request->CompletionMode;
/* Return Success */
PULONG BufferLength)
{
PNPFS_FCB Fcb;
PULONG BufferLength)
{
PNPFS_FCB Fcb;
+ ULONG ConnectionSideReadMode;
DPRINT("NpfsQueryPipeInformation()\n");
/* Get the Pipe */
DPRINT("NpfsQueryPipeInformation()\n");
/* Get the Pipe */
/* Clear Info */
RtlZeroMemory(Info, sizeof(FILE_PIPE_INFORMATION));
/* Clear Info */
RtlZeroMemory(Info, sizeof(FILE_PIPE_INFORMATION));
+
+
+ if (Ccb->PipeEnd == FILE_PIPE_CLIENT_END) ConnectionSideReadMode=Ccb->Fcb->ClientReadMode;
+ else ConnectionSideReadMode = Ccb->Fcb->ServerReadMode;
/* Return Info */
Info->CompletionMode = Fcb->CompletionMode;
/* Return Info */
Info->CompletionMode = Fcb->CompletionMode;
- Info->ReadMode = Fcb->ReadMode;
+ Info->ReadMode = ConnectionSideReadMode;
/* Return success */
*BufferLength -= sizeof(FILE_PIPE_INFORMATION);
/* Return success */
*BufferLength -= sizeof(FILE_PIPE_INFORMATION);
ReadDataAvailable -= MessageLength;
MessageCount++;
ReadDataAvailable -= MessageLength;
MessageCount++;
- if (Ccb->Fcb->ReadMode == FILE_PIPE_BYTE_STREAM_MODE)
- {
+ /* If its the first message, copy the Message if the size of buffer is large enough */
+ if (MessageCount==1)
+ {
- && (OutputBufferLength >= (MessageLength + ReturnLength + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0]))))
- {
- memcpy((PVOID)((ULONG_PTR)&Reply->Data[0] + ReturnLength),
- (PVOID)((ULONG)BufferPtr + sizeof(MessageLength)),
- MessageLength);
- ReturnLength += MessageLength;
- }
- }
- else
- {
- /* If its the first message, copy the Message if the size of buffer is large enough */
- if (MessageCount==1)
- {
- if ((Reply->Data[0])
- && (OutputBufferLength >= (MessageLength + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0]))))
- {
- memcpy(&Reply->Data[0], (PVOID)((ULONG)BufferPtr + sizeof(MessageLength)), MessageLength);
- ReturnLength = MessageLength;
- }
+ && (OutputBufferLength >= (MessageLength + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0]))))
+ {
+ memcpy(&Reply->Data[0], (PVOID)((ULONG)BufferPtr + sizeof(MessageLength)), MessageLength);
+ ReturnLength = MessageLength;
LIST_ENTRY WaiterListHead;
LIST_ENTRY EmptyBufferListHead;
ULONG PipeType;
LIST_ENTRY WaiterListHead;
LIST_ENTRY EmptyBufferListHead;
ULONG PipeType;
- ULONG ReadMode;
- ULONG WriteMode;
+ ULONG ClientReadMode;
+ ULONG ServerReadMode;
ULONG CompletionMode;
ULONG PipeConfiguration;
ULONG MaximumInstances;
ULONG CompletionMode;
ULONG PipeConfiguration;
ULONG MaximumInstances;
- DPRINT1("Pipe is NOT readable!\n");
+ DPRINT("Pipe is NOT readable!\n");
Status = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0;
goto done;
Status = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0;
goto done;
{
if (Ccb->ReadDataAvailable == 0)
{
{
if (Ccb->ReadDataAvailable == 0)
{
+ ULONG ConnectionSideReadMode;
+
+ if (Ccb->PipeEnd == FILE_PIPE_CLIENT_END) ConnectionSideReadMode=Ccb->Fcb->ClientReadMode;
+ else ConnectionSideReadMode = Ccb->Fcb->ServerReadMode;
+
if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)
{
ASSERT(Ccb->OtherSide != NULL);
KeSetEvent(&Ccb->OtherSide->WriteEvent, IO_NO_INCREMENT, FALSE);
}
if (Information > 0 &&
if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)
{
ASSERT(Ccb->OtherSide != NULL);
KeSetEvent(&Ccb->OtherSide->WriteEvent, IO_NO_INCREMENT, FALSE);
}
if (Information > 0 &&
- (Ccb->Fcb->ReadMode != FILE_PIPE_BYTE_STREAM_MODE ||
+ (ConnectionSideReadMode != FILE_PIPE_BYTE_STREAM_MODE ||
Ccb->PipeState != FILE_PIPE_CONNECTED_STATE))
{
break;
Ccb->PipeState != FILE_PIPE_CONNECTED_STATE))
{
break;
Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;
Context->WaitEvent = &Ccb->ReadEvent;
Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;
Context->WaitEvent = &Ccb->ReadEvent;
Status = NpfsAddWaitingReadWriteRequest(DeviceObject, Irp);
if (NT_SUCCESS(Status))
Status = NpfsAddWaitingReadWriteRequest(DeviceObject, Irp);
if (NT_SUCCESS(Status))
ASSERT(IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL);
/* If the pipe type and read mode are both byte stream */
ASSERT(IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL);
/* If the pipe type and read mode are both byte stream */
- if ((Ccb->Fcb->PipeType == FILE_PIPE_BYTE_STREAM_TYPE) && (Ccb->Fcb->ReadMode == FILE_PIPE_BYTE_STREAM_MODE))
+ if (Ccb->Fcb->PipeType == FILE_PIPE_BYTE_STREAM_TYPE)
{
DPRINT("Byte stream mode: Ccb->Data %x\n", Ccb->Data);
/* Byte stream mode */
{
DPRINT("Byte stream mode: Ccb->Data %x\n", Ccb->Data);
/* Byte stream mode */
- if ((Ccb->Fcb->ReadMode == FILE_PIPE_BYTE_STREAM_MODE) && (Ccb->ReadDataAvailable) && (Length > CopyLength))
+ ULONG ConnectionSideReadMode;
+
+ if (Ccb->PipeEnd == FILE_PIPE_CLIENT_END) ConnectionSideReadMode=Ccb->Fcb->ClientReadMode;
+ else ConnectionSideReadMode = Ccb->Fcb->ServerReadMode;
+
+ if ((ConnectionSideReadMode == FILE_PIPE_BYTE_STREAM_MODE) && (Ccb->ReadDataAvailable) && (Length > CopyLength))
{
Buffer = (PVOID)((ULONG_PTR)Buffer + CopyLength);
Length -= CopyLength;
{
Buffer = (PVOID)((ULONG_PTR)Buffer + CopyLength);
Length -= CopyLength;
if (IsOriginalRequest)
{
IsOriginalRequest = FALSE;
if (IsOriginalRequest)
{
IsOriginalRequest = FALSE;
DPRINT("NpfsRead done (Status %lx)\n", OriginalStatus);
return OriginalStatus;
}
DPRINT("NpfsRead done (Status %lx)\n", OriginalStatus);
return OriginalStatus;
}
+
+ IoAcquireCancelSpinLock(&oldIrql);
Context = CONTAINING_RECORD(Ccb->ReadRequestListHead.Flink, NPFS_CONTEXT, ListEntry);
Context = CONTAINING_RECORD(Ccb->ReadRequestListHead.Flink, NPFS_CONTEXT, ListEntry);
Irp = CONTAINING_RECORD(Context, IRP, Tail.Overlay.DriverContext);
Irp = CONTAINING_RECORD(Context, IRP, Tail.Overlay.DriverContext);
+ /* Verify the Irp wasnt cancelled */
+ if (Irp->Cancel)
+ {
+ IoReleaseCancelSpinLock(oldIrql);
+ RemoveEntryList(&Context->ListEntry);
+ ExReleaseFastMutex(&Ccb->DataListLock);
+ Status = STATUS_CANCELLED;
+ goto done;
+ }
+ /* The Irp will now be handled, so remove the CancelRoutine */
+ (void)IoSetCancelRoutine(Irp, NULL);
+ IoReleaseCancelSpinLock(oldIrql);
ExAcquireFastMutex(&ReaderCcb->DataListLock);
}
ExAcquireFastMutex(&ReaderCcb->DataListLock);
}
- if ((Ccb->Fcb->PipeType == FILE_PIPE_BYTE_STREAM_TYPE) && (Ccb->Fcb->WriteMode == FILE_PIPE_BYTE_STREAM_MODE))
+ if (Ccb->Fcb->PipeType == FILE_PIPE_BYTE_STREAM_TYPE)
{
DPRINT("Byte stream mode: Ccb->Data %x, Ccb->WritePtr %x\n", ReaderCcb->Data, ReaderCcb->WritePtr);
{
DPRINT("Byte stream mode: Ccb->Data %x, Ccb->WritePtr %x\n", ReaderCcb->Data, ReaderCcb->WritePtr);
- else if ((Ccb->Fcb->PipeType == FILE_PIPE_MESSAGE_TYPE) && (Ccb->Fcb->WriteMode == FILE_PIPE_MESSAGE_MODE))
+ else if (Ccb->Fcb->PipeType == FILE_PIPE_MESSAGE_TYPE)
{
/* For Message Type Pipe, the Pipes memory will be used to store the size of each message */
DPRINT("Message mode: Ccb->Data %x, Ccb->WritePtr %x\n",ReaderCcb->Data, ReaderCcb->WritePtr);
{
/* For Message Type Pipe, the Pipes memory will be used to store the size of each message */
DPRINT("Message mode: Ccb->Data %x, Ccb->WritePtr %x\n",ReaderCcb->Data, ReaderCcb->WritePtr);