mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
[msfs] Mail slot file system driver bring up 2/2:
- 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
This commit is contained in:
parent
6a29ad7b49
commit
174afbb80c
3 changed files with 48 additions and 18 deletions
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
/* Creates the client side */
|
||||||
NTSTATUS DEFAULTAPI
|
NTSTATUS DEFAULTAPI
|
||||||
MsfsCreate(PDEVICE_OBJECT DeviceObject,
|
MsfsCreate(PDEVICE_OBJECT DeviceObject,
|
||||||
PIRP Irp)
|
PIRP Irp)
|
||||||
|
@ -99,6 +100,7 @@ MsfsCreate(PDEVICE_OBJECT DeviceObject,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Creates the server side */
|
||||||
NTSTATUS DEFAULTAPI
|
NTSTATUS DEFAULTAPI
|
||||||
MsfsCreateMailslot(PDEVICE_OBJECT DeviceObject,
|
MsfsCreateMailslot(PDEVICE_OBJECT DeviceObject,
|
||||||
PIRP Irp)
|
PIRP Irp)
|
||||||
|
@ -197,7 +199,14 @@ MsfsCreateMailslot(PDEVICE_OBJECT DeviceObject,
|
||||||
ExFreePool(Fcb->Name.Buffer);
|
ExFreePool(Fcb->Name.Buffer);
|
||||||
ExFreePool(Fcb);
|
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
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -95,6 +95,19 @@ MsfsQueryInformation(PDEVICE_OBJECT DeviceObject,
|
||||||
|
|
||||||
DPRINT("Mailslot name: %wZ\n", &Fcb->Name);
|
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;
|
SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
|
||||||
BufferLength = IoStack->Parameters.QueryFile.Length;
|
BufferLength = IoStack->Parameters.QueryFile.Length;
|
||||||
|
|
||||||
|
|
|
@ -62,25 +62,33 @@ MsfsRead(PDEVICE_OBJECT DeviceObject,
|
||||||
KernelMode,
|
KernelMode,
|
||||||
FALSE,
|
FALSE,
|
||||||
&Fcb->TimeOut);
|
&Fcb->TimeOut);
|
||||||
if ((NT_SUCCESS(Status)) && (Fcb->MessageCount > 0))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* copy current message into buffer */
|
if (Fcb->MessageCount > 0)
|
||||||
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);
|
/* 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue