3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: drivers/filesystems/ms/create.c
6 * PURPOSE: Mailslot filesystem
7 * PROGRAMMER: Eric Kohl
10 /* INCLUDES ******************************************************************/
18 /* FUNCTIONS *****************************************************************/
21 MsfsCreate(PDEVICE_OBJECT DeviceObject
,
24 PIO_STACK_LOCATION IoStack
;
25 PFILE_OBJECT FileObject
;
26 PMSFS_DEVICE_EXTENSION DeviceExtension
;
29 PMSFS_FCB current
= NULL
;
30 PLIST_ENTRY current_entry
;
33 DPRINT("MsfsCreate(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
35 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
36 DeviceExtension
= DeviceObject
->DeviceExtension
;
37 FileObject
= IoStack
->FileObject
;
39 DPRINT("Mailslot name: %wZ\n", &FileObject
->FileName
);
41 Ccb
= ExAllocatePool(NonPagedPool
, sizeof(MSFS_CCB
));
44 Irp
->IoStatus
.Status
= STATUS_NO_MEMORY
;
45 Irp
->IoStatus
.Information
= 0;
47 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
48 return STATUS_NO_MEMORY
;
51 KeLockMutex(&DeviceExtension
->FcbListLock
);
52 current_entry
= DeviceExtension
->FcbListHead
.Flink
;
53 while (current_entry
!= &DeviceExtension
->FcbListHead
)
55 current
= CONTAINING_RECORD(current_entry
,
59 if (!RtlCompareUnicodeString(&FileObject
->FileName
, ¤t
->Name
, TRUE
))
62 current_entry
= current_entry
->Flink
;
65 if (current_entry
== &DeviceExtension
->FcbListHead
)
68 KeUnlockMutex(&DeviceExtension
->FcbListLock
);
70 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
71 Irp
->IoStatus
.Information
= 0;
73 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
75 return STATUS_UNSUCCESSFUL
;
80 KeAcquireSpinLock(&Fcb
->CcbListLock
, &oldIrql
);
81 InsertTailList(&Fcb
->CcbListHead
, &Ccb
->CcbListEntry
);
82 KeReleaseSpinLock(&Fcb
->CcbListLock
, oldIrql
);
84 Fcb
->ReferenceCount
++;
88 KeUnlockMutex(&DeviceExtension
->FcbListLock
);
90 FileObject
->FsContext
= Fcb
;
91 FileObject
->FsContext2
= Ccb
;
92 FileObject
->Flags
|= FO_MAILSLOT
;
94 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
95 Irp
->IoStatus
.Information
= 0;
97 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
99 return STATUS_SUCCESS
;
104 MsfsCreateMailslot(PDEVICE_OBJECT DeviceObject
,
107 PEXTENDED_IO_STACK_LOCATION IoStack
;
108 PFILE_OBJECT FileObject
;
109 PMSFS_DEVICE_EXTENSION DeviceExtension
;
113 PLIST_ENTRY current_entry
;
115 PMAILSLOT_CREATE_PARAMETERS Buffer
;
117 DPRINT("MsfsCreateMailslot(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
119 IoStack
= (PEXTENDED_IO_STACK_LOCATION
)IoGetCurrentIrpStackLocation(Irp
);
120 DeviceExtension
= DeviceObject
->DeviceExtension
;
121 FileObject
= IoStack
->FileObject
;
122 Buffer
= IoStack
->Parameters
.CreateMailslot
.Parameters
;
124 DPRINT("Mailslot name: %wZ\n", &FileObject
->FileName
);
126 Fcb
= ExAllocatePool(NonPagedPool
, sizeof(MSFS_FCB
));
129 Irp
->IoStatus
.Status
= STATUS_NO_MEMORY
;
130 Irp
->IoStatus
.Information
= 0;
132 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
134 return STATUS_NO_MEMORY
;
137 Fcb
->Name
.Length
= FileObject
->FileName
.Length
;
138 Fcb
->Name
.MaximumLength
= Fcb
->Name
.Length
+ sizeof(UNICODE_NULL
);
139 Fcb
->Name
.Buffer
= ExAllocatePool(NonPagedPool
, Fcb
->Name
.MaximumLength
);
140 if (Fcb
->Name
.Buffer
== NULL
)
144 Irp
->IoStatus
.Status
= STATUS_NO_MEMORY
;
145 Irp
->IoStatus
.Information
= 0;
147 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
149 return STATUS_NO_MEMORY
;
152 RtlCopyUnicodeString(&Fcb
->Name
, &FileObject
->FileName
);
154 Ccb
= ExAllocatePool(NonPagedPool
, sizeof(MSFS_CCB
));
157 ExFreePool(Fcb
->Name
.Buffer
);
160 Irp
->IoStatus
.Status
= STATUS_NO_MEMORY
;
161 Irp
->IoStatus
.Information
= 0;
163 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
165 return STATUS_NO_MEMORY
;
168 Fcb
->ReferenceCount
= 0;
169 InitializeListHead(&Fcb
->CcbListHead
);
170 KeInitializeSpinLock(&Fcb
->CcbListLock
);
172 Fcb
->MaxMessageSize
= Buffer
->MaximumMessageSize
;
173 Fcb
->MessageCount
= 0;
174 Fcb
->TimeOut
= Buffer
->ReadTimeout
;
175 KeInitializeEvent(&Fcb
->MessageEvent
,
179 InitializeListHead(&Fcb
->MessageListHead
);
180 KeInitializeSpinLock(&Fcb
->MessageListLock
);
182 KeLockMutex(&DeviceExtension
->FcbListLock
);
183 current_entry
= DeviceExtension
->FcbListHead
.Flink
;
184 while (current_entry
!= &DeviceExtension
->FcbListHead
)
186 current
= CONTAINING_RECORD(current_entry
,
190 if (!RtlCompareUnicodeString(&Fcb
->Name
, ¤t
->Name
, TRUE
))
193 current_entry
= current_entry
->Flink
;
196 if (current_entry
!= &DeviceExtension
->FcbListHead
)
198 ExFreePool(Fcb
->Name
.Buffer
);
205 InsertTailList(&DeviceExtension
->FcbListHead
,
209 KeAcquireSpinLock(&Fcb
->CcbListLock
, &oldIrql
);
210 InsertTailList(&Fcb
->CcbListHead
, &Ccb
->CcbListEntry
);
211 KeReleaseSpinLock(&Fcb
->CcbListLock
, oldIrql
);
213 Fcb
->ReferenceCount
++;
214 Fcb
->ServerCcb
= Ccb
;
217 KeUnlockMutex(&DeviceExtension
->FcbListLock
);
219 FileObject
->FsContext
= Fcb
;
220 FileObject
->FsContext2
= Ccb
;
221 FileObject
->Flags
|= FO_MAILSLOT
;
223 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
224 Irp
->IoStatus
.Information
= 0;
226 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
228 return STATUS_SUCCESS
;
233 MsfsClose(PDEVICE_OBJECT DeviceObject
,
236 PIO_STACK_LOCATION IoStack
;
237 PFILE_OBJECT FileObject
;
238 PMSFS_DEVICE_EXTENSION DeviceExtension
;
241 PMSFS_MESSAGE Message
;
244 DPRINT("MsfsClose(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
246 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
247 DeviceExtension
= DeviceObject
->DeviceExtension
;
248 FileObject
= IoStack
->FileObject
;
250 KeLockMutex(&DeviceExtension
->FcbListLock
);
252 if (DeviceExtension
->FcbListHead
.Flink
== &DeviceExtension
->FcbListHead
)
254 KeUnlockMutex(&DeviceExtension
->FcbListLock
);
256 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
257 Irp
->IoStatus
.Information
= 0;
259 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
261 return STATUS_SUCCESS
;
264 Fcb
= FileObject
->FsContext
;
265 Ccb
= FileObject
->FsContext2
;
267 DPRINT("Mailslot name: %wZ\n", &Fcb
->Name
);
269 Fcb
->ReferenceCount
--;
270 if (Fcb
->ServerCcb
== Ccb
)
272 /* delete all messages from message-list */
273 KeAcquireSpinLock(&Fcb
->MessageListLock
, &oldIrql
);
275 while (Fcb
->MessageListHead
.Flink
!= &Fcb
->MessageListHead
)
277 Message
= CONTAINING_RECORD(Fcb
->MessageListHead
.Flink
,
280 RemoveEntryList(Fcb
->MessageListHead
.Flink
);
284 Fcb
->MessageCount
= 0;
286 KeReleaseSpinLock(&Fcb
->MessageListLock
, oldIrql
);
287 Fcb
->ServerCcb
= NULL
;
290 KeAcquireSpinLock(&Fcb
->CcbListLock
, &oldIrql
);
291 RemoveEntryList(&Ccb
->CcbListEntry
);
292 KeReleaseSpinLock(&Fcb
->CcbListLock
, oldIrql
);
294 FileObject
->FsContext2
= NULL
;
296 if (Fcb
->ReferenceCount
== 0)
298 DPRINT1("ReferenceCount == 0: Deleting mailslot data\n");
299 RemoveEntryList(&Fcb
->FcbListEntry
);
300 ExFreePool(Fcb
->Name
.Buffer
);
304 KeUnlockMutex(&DeviceExtension
->FcbListLock
);
306 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
307 Irp
->IoStatus
.Information
= 0;
309 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
311 return STATUS_SUCCESS
;