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 ******************************************************************/
17 /* FUNCTIONS *****************************************************************/
20 MsfsRead(PDEVICE_OBJECT DeviceObject
,
23 PIO_STACK_LOCATION IoStack
;
24 PFILE_OBJECT FileObject
;
27 PMSFS_MESSAGE Message
;
34 DPRINT("MsfsRead(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
36 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
37 FileObject
= IoStack
->FileObject
;
38 Fcb
= (PMSFS_FCB
)FileObject
->FsContext
;
39 Ccb
= (PMSFS_CCB
)FileObject
->FsContext2
;
41 DPRINT("MailslotName: %wZ\n", &Fcb
->Name
);
43 /* reading is not permitted on client side */
44 if (Fcb
->ServerCcb
!= Ccb
)
46 Irp
->IoStatus
.Status
= STATUS_ACCESS_DENIED
;
47 Irp
->IoStatus
.Information
= 0;
49 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
51 return STATUS_ACCESS_DENIED
;
54 Length
= IoStack
->Parameters
.Read
.Length
;
56 Buffer
= MmGetSystemAddressForMdl (Irp
->MdlAddress
);
58 Buffer
= Irp
->UserBuffer
;
60 Status
= KeWaitForSingleObject(&Fcb
->MessageEvent
,
65 if (NT_SUCCESS(Status
))
67 if (Fcb
->MessageCount
> 0)
69 /* copy current message into buffer */
70 Message
= CONTAINING_RECORD(Fcb
->MessageListHead
.Flink
,
74 memcpy(Buffer
, &Message
->Buffer
, min(Message
->Size
,Length
));
75 LengthRead
= Message
->Size
;
77 KeAcquireSpinLock(&Fcb
->MessageListLock
, &oldIrql
);
78 RemoveHeadList(&Fcb
->MessageListHead
);
79 KeReleaseSpinLock(&Fcb
->MessageListLock
, oldIrql
);
83 if (Fcb
->MessageCount
== 0)
85 KeClearEvent(&Fcb
->MessageEvent
);
88 else if (Fcb
->TimeOut
.QuadPart
!= 0LL)
90 /* No message found after waiting */
91 Status
= STATUS_IO_TIMEOUT
;
95 Irp
->IoStatus
.Status
= Status
;
96 Irp
->IoStatus
.Information
= LengthRead
;
98 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
105 MsfsWrite(PDEVICE_OBJECT DeviceObject
,
108 PIO_STACK_LOCATION IoStack
;
109 PFILE_OBJECT FileObject
;
112 PMSFS_MESSAGE Message
;
117 DPRINT("MsfsWrite(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
119 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
120 FileObject
= IoStack
->FileObject
;
121 Fcb
= (PMSFS_FCB
)FileObject
->FsContext
;
122 Ccb
= (PMSFS_CCB
)FileObject
->FsContext2
;
124 DPRINT("MailslotName: %wZ\n", &Fcb
->Name
);
126 /* writing is not permitted on server side */
127 if (Fcb
->ServerCcb
== Ccb
)
129 Irp
->IoStatus
.Status
= STATUS_ACCESS_DENIED
;
130 Irp
->IoStatus
.Information
= 0;
132 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
134 return STATUS_ACCESS_DENIED
;
137 Length
= IoStack
->Parameters
.Write
.Length
;
139 Buffer
= MmGetSystemAddressForMdl (Irp
->MdlAddress
);
141 Buffer
= Irp
->UserBuffer
;
143 DPRINT("Length: %lu Message: %s\n", Length
, (PUCHAR
)Buffer
);
145 /* Allocate new message */
146 Message
= ExAllocatePool(NonPagedPool
,
147 sizeof(MSFS_MESSAGE
) + Length
);
150 Irp
->IoStatus
.Status
= STATUS_NO_MEMORY
;
151 Irp
->IoStatus
.Information
= 0;
153 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
155 return STATUS_NO_MEMORY
;
158 Message
->Size
= Length
;
159 memcpy(&Message
->Buffer
, Buffer
, Length
);
161 KeAcquireSpinLock(&Fcb
->MessageListLock
, &oldIrql
);
162 InsertTailList(&Fcb
->MessageListHead
, &Message
->MessageListEntry
);
163 KeReleaseSpinLock(&Fcb
->MessageListLock
, oldIrql
);
166 if (Fcb
->MessageCount
== 1)
168 KeSetEvent(&Fcb
->MessageEvent
,
173 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
174 Irp
->IoStatus
.Information
= Length
;
176 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
178 return STATUS_SUCCESS
;