/* FUNCTIONS *****************************************************************/
+/* Creates the client side */
NTSTATUS DEFAULTAPI
MsfsCreate(PDEVICE_OBJECT DeviceObject,
PIRP Irp)
}
+/* Creates the server side */
NTSTATUS DEFAULTAPI
MsfsCreateMailslot(PDEVICE_OBJECT DeviceObject,
PIRP Irp)
ExFreePool(Fcb->Name.Buffer);
ExFreePool(Fcb);
- Fcb = current;
+ KeUnlockMutex(&DeviceExtension->FcbListLock);
+
+ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+ Irp->IoStatus.Information = 0;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_UNSUCCESSFUL;
}
else
{
DPRINT("Mailslot name: %wZ\n", &Fcb->Name);
+ /* querying information is not permitted on client side */
+ if (Fcb->ServerCcb != Ccb)
+ {
+ Status = STATUS_ACCESS_DENIED;
+
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = 0;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return Status;
+ }
+
SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
BufferLength = IoStack->Parameters.QueryFile.Length;
KernelMode,
FALSE,
&Fcb->TimeOut);
- if ((NT_SUCCESS(Status)) && (Fcb->MessageCount > 0))
+ if (NT_SUCCESS(Status))
{
- /* copy current message into buffer */
- Message = CONTAINING_RECORD(Fcb->MessageListHead.Flink,
- MSFS_MESSAGE,
- MessageListEntry);
-
- memcpy(Buffer, &Message->Buffer, min(Message->Size,Length));
- LengthRead = Message->Size;
-
- KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
- RemoveHeadList(&Fcb->MessageListHead);
- KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
-
- ExFreePool(Message);
- Fcb->MessageCount--;
- if (Fcb->MessageCount == 0)
+ if (Fcb->MessageCount > 0)
+ {
+ /* copy current message into buffer */
+ Message = CONTAINING_RECORD(Fcb->MessageListHead.Flink,
+ MSFS_MESSAGE,
+ MessageListEntry);
+
+ memcpy(Buffer, &Message->Buffer, min(Message->Size,Length));
+ LengthRead = Message->Size;
+
+ KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
+ RemoveHeadList(&Fcb->MessageListHead);
+ KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
+
+ ExFreePool(Message);
+ Fcb->MessageCount--;
+ if (Fcb->MessageCount == 0)
+ {
+ KeClearEvent(&Fcb->MessageEvent);
+ }
+ }
+ else if (Fcb->TimeOut.QuadPart != 0LL)
{
- KeClearEvent(&Fcb->MessageEvent);
+ /* No message found after waiting */
+ Status = STATUS_IO_TIMEOUT;
}
}