KeLockMutex(&Ccb->Fcb->CcbListLock);
- IoMarkIrpPending(Irp);
- InsertTailList(&Ccb->Fcb->WaiterListHead, &Entry->Entry);
-
IoAcquireCancelSpinLock(&oldIrql);
if (!Irp->Cancel)
{
+ Ccb->PipeState = FILE_PIPE_LISTENING_STATE;
+ IoMarkIrpPending(Irp);
+ InsertTailList(&Ccb->Fcb->WaiterListHead, &Entry->Entry);
(void)IoSetCancelRoutine(Irp, NpfsListeningCancelRoutine);
IoReleaseCancelSpinLock(oldIrql);
KeUnlockMutex(&Ccb->Fcb->CcbListLock);
PNPFS_FCB Fcb;
PNPFS_CCB ClientCcb;
NTSTATUS Status;
+ KPROCESSOR_MODE WaitMode;
DPRINT("NpfsConnectPipe()\n");
IoStack = IoGetCurrentIrpStackLocation(Irp);
FileObject = IoStack->FileObject;
Flags = FileObject->Flags;
+ WaitMode = Irp->RequestorMode;
/* search for a listening client fcb */
KeLockMutex(&Fcb->CcbListLock);
/* no listening client fcb found */
DPRINT("No listening client fcb found -- waiting for client\n");
- Ccb->PipeState = FILE_PIPE_LISTENING_STATE;
-
Status = NpfsAddListeningServerInstance(Irp, Ccb);
KeUnlockMutex(&Fcb->CcbListLock);
- if (Flags & FO_SYNCHRONOUS_IO)
+ if ((Status == STATUS_PENDING) && (Flags & FO_SYNCHRONOUS_IO))
{
KeWaitForSingleObject(&Ccb->ConnectEvent,
UserRequest,
- Irp->RequestorMode,
- FALSE,
+ WaitMode,
+ (Flags & FO_ALERTABLE_IO) != 0,
NULL);
}
{
RemoveEntryList(Entry);
Irp = CONTAINING_RECORD(Entry, IRP, Tail.Overlay.DriverContext);
- Complete = (NULL == IoSetCancelRoutine(Irp, NULL));
+ Complete = (NULL != IoSetCancelRoutine(Irp, NULL));
break;
}
Entry = Entry->Flink;
{
/* found a listening server CCB */
DPRINT("Listening server CCB found -- connecting\n");
-
+ NpfsDereferenceFcb(Fcb);
return STATUS_SUCCESS;
}
/* Wait forever */
TimeOut = NULL;
}
+ NpfsDereferenceFcb(Fcb);
- Status = KeWaitForSingleObject(&Ccb->ConnectEvent,
- UserRequest,
- KernelMode,
- TRUE,
- TimeOut);
+ Status = KeWaitForSingleObject(&Ccb->ConnectEvent,
+ UserRequest,
+ Irp->RequestorMode,
+ (Ccb->FileObject->Flags & FO_ALERTABLE_IO) != 0,
+ TimeOut);
+ if ((Status == STATUS_USER_APC) || (Status == STATUS_KERNEL_APC) || (Status == STATUS_ALERTED))
+ Status = STATUS_CANCELLED;
DPRINT("KeWaitForSingleObject() returned (Status %lx)\n", Status);
{
/* found a listening server CCB */
DPRINT("Listening server CCB found -- connecting\n");
-
+#ifdef USING_PROPER_NPFS_WAIT_SEMANTICS
+ NpfsDereferenceFcb(Fcb);
+#endif
return STATUS_SUCCESS;
}
TimeOut = WaitPipe->Timeout;
else
TimeOut = Fcb->TimeOut;
+#ifdef USING_PROPER_NPFS_WAIT_SEMANTICS
+ NpfsDereferenceFcb(Fcb);
+#endif
/* Wait for one */
Status = KeWaitForSingleObject(&Ccb->ConnectEvent,
UserRequest,
- KernelMode,
- FALSE,
+ Irp->RequestorMode,
+ (Ccb->FileObject->Flags & FO_ALERTABLE_IO) != 0,
&TimeOut);
+ if ((Status == STATUS_USER_APC) || (Status == STATUS_KERNEL_APC) || (Status == STATUS_ALERTED))
+ Status = STATUS_CANCELLED;
DPRINT("KeWaitForSingleObject() returned (Status %lx)\n", Status);
DPRINT("OutputBufferLength: %lu\n", OutputBufferLength);
/* Validate parameters */
- if (OutputBufferLength < sizeof(FILE_PIPE_PEEK_BUFFER))
+ if (OutputBufferLength < FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0]))
{
DPRINT1("Buffer too small\n");
return STATUS_INVALID_PARAMETER;
}
Ccb = IoStack->FileObject->FsContext2;
- Reply = (PFILE_PIPE_PEEK_BUFFER)Irp->AssociatedIrp.SystemBuffer;
+ Reply = Irp->AssociatedIrp.SystemBuffer;
//Fcb = Ccb->Fcb;
{
DPRINT("Byte Stream Mode\n");
Reply->MessageLength = Ccb->ReadDataAvailable;
- DPRINT("Reply->MessageLength %lu\n",Reply->MessageLength );
+ DPRINT("Reply->MessageLength %lu\n", Reply->MessageLength);
MessageCount = 1;
- if (Reply->Data[0] && (OutputBufferLength >= Ccb->ReadDataAvailable + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0])))
+ if (OutputBufferLength >= FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[Ccb->ReadDataAvailable]))
{
+ RtlCopyMemory(Reply->Data, BufferPtr, Ccb->ReadDataAvailable);
ReturnLength = Ccb->ReadDataAvailable;
- memcpy(&Reply->Data[0], (PVOID)BufferPtr, Ccb->ReadDataAvailable);
}
}
else
{
DPRINT("Message Mode\n");
- ReadDataAvailable=Ccb->ReadDataAvailable;
+ ReadDataAvailable = Ccb->ReadDataAvailable;
if (ReadDataAvailable > 0)
{
- memcpy(&Reply->MessageLength, BufferPtr, sizeof(ULONG));
+ RtlCopyMemory(&Reply->MessageLength,
+ BufferPtr,
+ sizeof(Reply->MessageLength));
while ((ReadDataAvailable > 0) && (BufferPtr < Ccb->WritePtr))
{
- memcpy(&MessageLength, BufferPtr, sizeof(MessageLength));
+ RtlCopyMemory(&MessageLength, BufferPtr, sizeof(MessageLength));
ASSERT(MessageLength > 0);
- DPRINT("MessageLength = %lu\n",MessageLength);
+ DPRINT("MessageLength = %lu\n", MessageLength);
ReadDataAvailable -= MessageLength;
MessageCount++;
/* If its the first message, copy the Message if the size of buffer is large enough */
- if (MessageCount==1)
+ if (MessageCount == 1)
{
- if ((Reply->Data[0])
- && (OutputBufferLength >= (MessageLength + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0]))))
+ if (OutputBufferLength >= FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[MessageLength]))
{
- memcpy(&Reply->Data[0], (PVOID)((ULONG_PTR)BufferPtr + sizeof(MessageLength)), MessageLength);
+ RtlCopyMemory(Reply->Data,
+ (PVOID)((ULONG_PTR)BufferPtr + sizeof(MessageLength)),
+ MessageLength);
ReturnLength = MessageLength;
}
}
- BufferPtr =(PVOID)((ULONG_PTR)BufferPtr + MessageLength + sizeof(MessageLength));
+ BufferPtr = (PVOID)((ULONG_PTR)BufferPtr + sizeof(MessageLength) + MessageLength);
DPRINT("BufferPtr = %x\n", BufferPtr);
DPRINT("ReadDataAvailable: %lu\n", ReadDataAvailable);
}
Reply->NumberOfMessages = MessageCount;
- Irp->IoStatus.Information = ReturnLength + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0]);
+ Irp->IoStatus.Information = FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[ReturnLength]);
Irp->IoStatus.Status = STATUS_SUCCESS;
Status = STATUS_SUCCESS;