2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/filesystems/msfs/rw.c
5 * PURPOSE: Mailslot filesystem
6 * PROGRAMMER: Eric Kohl
9 /* INCLUDES ******************************************************************/
16 /* FUNCTIONS *****************************************************************/
19 MsfsRead(PDEVICE_OBJECT DeviceObject
,
22 PIO_STACK_LOCATION IoStack
;
23 PFILE_OBJECT FileObject
;
26 PMSFS_MESSAGE Message
;
33 DPRINT("MsfsRead(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
35 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
36 FileObject
= IoStack
->FileObject
;
37 Fcb
= (PMSFS_FCB
)FileObject
->FsContext
;
38 Ccb
= (PMSFS_CCB
)FileObject
->FsContext2
;
40 DPRINT("MailslotName: %wZ\n", &Fcb
->Name
);
42 /* reading is not permitted on client side */
43 if (Fcb
->ServerCcb
!= Ccb
)
45 Irp
->IoStatus
.Status
= STATUS_ACCESS_DENIED
;
46 Irp
->IoStatus
.Information
= 0;
48 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
50 return STATUS_ACCESS_DENIED
;
53 Length
= IoStack
->Parameters
.Read
.Length
;
55 Buffer
= MmGetSystemAddressForMdl (Irp
->MdlAddress
);
57 Buffer
= Irp
->UserBuffer
;
59 Status
= KeWaitForSingleObject(&Fcb
->MessageEvent
,
64 if (NT_SUCCESS(Status
))
66 if (Fcb
->MessageCount
> 0)
68 /* copy current message into buffer */
69 Message
= CONTAINING_RECORD(Fcb
->MessageListHead
.Flink
,
73 memcpy(Buffer
, &Message
->Buffer
, min(Message
->Size
,Length
));
74 LengthRead
= Message
->Size
;
76 KeAcquireSpinLock(&Fcb
->MessageListLock
, &oldIrql
);
77 RemoveHeadList(&Fcb
->MessageListHead
);
78 KeReleaseSpinLock(&Fcb
->MessageListLock
, oldIrql
);
82 if (Fcb
->MessageCount
== 0)
84 KeClearEvent(&Fcb
->MessageEvent
);
87 else if (Fcb
->TimeOut
.QuadPart
!= 0LL)
89 /* No message found after waiting */
90 Status
= STATUS_IO_TIMEOUT
;
94 Irp
->IoStatus
.Status
= Status
;
95 Irp
->IoStatus
.Information
= LengthRead
;
97 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
104 MsfsWrite(PDEVICE_OBJECT DeviceObject
,
107 PIO_STACK_LOCATION IoStack
;
108 PFILE_OBJECT FileObject
;
111 PMSFS_MESSAGE Message
;
116 DPRINT("MsfsWrite(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
118 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
119 FileObject
= IoStack
->FileObject
;
120 Fcb
= (PMSFS_FCB
)FileObject
->FsContext
;
121 Ccb
= (PMSFS_CCB
)FileObject
->FsContext2
;
123 DPRINT("MailslotName: %wZ\n", &Fcb
->Name
);
125 /* writing is not permitted on server side */
126 if (Fcb
->ServerCcb
== Ccb
)
128 Irp
->IoStatus
.Status
= STATUS_ACCESS_DENIED
;
129 Irp
->IoStatus
.Information
= 0;
131 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
133 return STATUS_ACCESS_DENIED
;
136 Length
= IoStack
->Parameters
.Write
.Length
;
138 Buffer
= MmGetSystemAddressForMdl (Irp
->MdlAddress
);
140 Buffer
= Irp
->UserBuffer
;
142 DPRINT("Length: %lu Message: %s\n", Length
, (PUCHAR
)Buffer
);
144 /* Allocate new message */
145 Message
= ExAllocatePool(NonPagedPool
,
146 sizeof(MSFS_MESSAGE
) + Length
);
149 Irp
->IoStatus
.Status
= STATUS_NO_MEMORY
;
150 Irp
->IoStatus
.Information
= 0;
152 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
154 return STATUS_NO_MEMORY
;
157 Message
->Size
= Length
;
158 memcpy(&Message
->Buffer
, Buffer
, Length
);
160 KeAcquireSpinLock(&Fcb
->MessageListLock
, &oldIrql
);
161 InsertTailList(&Fcb
->MessageListHead
, &Message
->MessageListEntry
);
162 KeReleaseSpinLock(&Fcb
->MessageListLock
, oldIrql
);
165 if (Fcb
->MessageCount
== 1)
167 KeSetEvent(&Fcb
->MessageEvent
,
172 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
173 Irp
->IoStatus
.Information
= Length
;
175 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
177 return STATUS_SUCCESS
;