[msfs] Mail slot file system driver bring up 2/2:
authorGregor Schneider <grschneider@gmail.com>
Fri, 11 Dec 2009 09:45:07 +0000 (09:45 +0000)
committerGregor Schneider <grschneider@gmail.com>
Fri, 11 Dec 2009 09:45:07 +0000 (09:45 +0000)
- Don't allow to create two mail slots with the same name
- Pass a timeout return status when no message are found after waiting
- Clients aren't allowed to query mail slot info, this works now - add the code back

svn path=/trunk/; revision=44533

reactos/drivers/filesystems/msfs/create.c
reactos/drivers/filesystems/msfs/finfo.c
reactos/drivers/filesystems/msfs/rw.c

index 37407dc..998a83f 100644 (file)
@@ -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
     {
index 9b7b34a..16c6496 100644 (file)
@@ -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;
 
index f2b59c8..f0c66ed 100644 (file)
@@ -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)
+        {
+            /* 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;
         }
      }