diff --git a/reactos/drivers/filesystems/msfs/create.c b/reactos/drivers/filesystems/msfs/create.c index 37407dc832b..998a83f5e55 100644 --- a/reactos/drivers/filesystems/msfs/create.c +++ b/reactos/drivers/filesystems/msfs/create.c @@ -16,6 +16,7 @@ /* FUNCTIONS *****************************************************************/ +/* Creates the client side */ NTSTATUS DEFAULTAPI MsfsCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp) @@ -99,6 +100,7 @@ MsfsCreate(PDEVICE_OBJECT DeviceObject, } +/* Creates the server side */ NTSTATUS DEFAULTAPI MsfsCreateMailslot(PDEVICE_OBJECT DeviceObject, PIRP Irp) @@ -197,7 +199,14 @@ MsfsCreateMailslot(PDEVICE_OBJECT DeviceObject, 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 { diff --git a/reactos/drivers/filesystems/msfs/finfo.c b/reactos/drivers/filesystems/msfs/finfo.c index 9b7b34ade5e..16c64969b1d 100644 --- a/reactos/drivers/filesystems/msfs/finfo.c +++ b/reactos/drivers/filesystems/msfs/finfo.c @@ -95,6 +95,19 @@ MsfsQueryInformation(PDEVICE_OBJECT DeviceObject, 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; diff --git a/reactos/drivers/filesystems/msfs/rw.c b/reactos/drivers/filesystems/msfs/rw.c index f2b59c8a4bd..f0c66ed56c9 100644 --- a/reactos/drivers/filesystems/msfs/rw.c +++ b/reactos/drivers/filesystems/msfs/rw.c @@ -62,25 +62,33 @@ MsfsRead(PDEVICE_OBJECT DeviceObject, 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) { - KeClearEvent(&Fcb->MessageEvent); + /* 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) + { + /* No message found after waiting */ + Status = STATUS_IO_TIMEOUT; } }