*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
- * FILE: services/fs/ms/create.c
+ * FILE: drivers/filesystems/ms/create.c
* PURPOSE: Mailslot filesystem
- * PROGRAMMER: Eric Kohl <ekohl@rz-online.de>
+ * PROGRAMMER: Eric Kohl
*/
/* INCLUDES ******************************************************************/
NTSTATUS DEFAULTAPI
MsfsCreate(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+ PIRP Irp)
{
- PIO_STACK_LOCATION IoStack;
- PFILE_OBJECT FileObject;
- PMSFS_DEVICE_EXTENSION DeviceExtension;
- PMSFS_FCB Fcb;
- PMSFS_CCB Ccb;
- PMSFS_FCB current = NULL;
- PLIST_ENTRY current_entry;
- KIRQL oldIrql;
+ PIO_STACK_LOCATION IoStack;
+ PFILE_OBJECT FileObject;
+ PMSFS_DEVICE_EXTENSION DeviceExtension;
+ PMSFS_FCB Fcb;
+ PMSFS_CCB Ccb;
+ PMSFS_FCB current = NULL;
+ PLIST_ENTRY current_entry;
+ KIRQL oldIrql;
- DPRINT("MsfsCreate(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
+ DPRINT("MsfsCreate(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
- IoStack = IoGetCurrentIrpStackLocation(Irp);
- DeviceExtension = DeviceObject->DeviceExtension;
- FileObject = IoStack->FileObject;
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ DeviceExtension = DeviceObject->DeviceExtension;
+ FileObject = IoStack->FileObject;
- DPRINT("Mailslot name: %wZ\n", &FileObject->FileName);
+ DPRINT("Mailslot name: %wZ\n", &FileObject->FileName);
- Ccb = ExAllocatePool(NonPagedPool, sizeof(MSFS_CCB));
- if (Ccb == NULL)
- {
- Irp->IoStatus.Status = STATUS_NO_MEMORY;
- Irp->IoStatus.Information = 0;
+ Ccb = ExAllocatePool(NonPagedPool, sizeof(MSFS_CCB));
+ if (Ccb == NULL)
+ {
+ Irp->IoStatus.Status = STATUS_NO_MEMORY;
+ Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_NO_MEMORY;
+ }
- return(STATUS_NO_MEMORY);
- }
+ KeLockMutex(&DeviceExtension->FcbListLock);
+ current_entry = DeviceExtension->FcbListHead.Flink;
+ while (current_entry != &DeviceExtension->FcbListHead)
+ {
+ current = CONTAINING_RECORD(current_entry,
+ MSFS_FCB,
+ FcbListEntry);
- KeLockMutex(&DeviceExtension->FcbListLock);
- current_entry = DeviceExtension->FcbListHead.Flink;
- while (current_entry != &DeviceExtension->FcbListHead)
- {
- current = CONTAINING_RECORD(current_entry,
- MSFS_FCB,
- FcbListEntry);
+ if (!RtlCompareUnicodeString(&FileObject->FileName, ¤t->Name, TRUE))
+ break;
- if (!RtlCompareUnicodeString(&FileObject->FileName, ¤t->Name, TRUE))
- {
- break;
- }
+ current_entry = current_entry->Flink;
+ }
- current_entry = current_entry->Flink;
- }
+ if (current_entry == &DeviceExtension->FcbListHead)
+ {
+ ExFreePool(Ccb);
+ KeUnlockMutex(&DeviceExtension->FcbListLock);
- if (current_entry == &DeviceExtension->FcbListHead)
- {
- ExFreePool(Ccb);
- KeUnlockMutex(&DeviceExtension->FcbListLock);
+ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+ Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
- Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_UNSUCCESSFUL;
+ }
- return(STATUS_UNSUCCESSFUL);
- }
+ Fcb = current;
- Fcb = current;
- DPRINT1("Fcb: %p\n", Fcb);
+ KeAcquireSpinLock(&Fcb->CcbListLock, &oldIrql);
+ InsertTailList(&Fcb->CcbListHead, &Ccb->CcbListEntry);
+ KeReleaseSpinLock(&Fcb->CcbListLock, oldIrql);
- KeAcquireSpinLock(&Fcb->CcbListLock, &oldIrql);
- InsertTailList(&Fcb->CcbListHead, &Ccb->CcbListEntry);
- KeReleaseSpinLock(&Fcb->CcbListLock, oldIrql);
+ Fcb->ReferenceCount++;
- Fcb->ReferenceCount++;
+ Ccb->Fcb = Fcb;
- Ccb->Fcb = Fcb;
+ KeUnlockMutex(&DeviceExtension->FcbListLock);
- KeUnlockMutex(&DeviceExtension->FcbListLock);
+ FileObject->FsContext = Fcb;
+ FileObject->FsContext2 = Ccb;
+ FileObject->Flags |= FO_MAILSLOT;
- FileObject->FsContext = Fcb;
- FileObject->FsContext2 = Ccb;
- FileObject->Flags |= FO_MAILSLOT;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return(STATUS_SUCCESS);
+ return STATUS_SUCCESS;
}
NTSTATUS DEFAULTAPI
MsfsCreateMailslot(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+ PIRP Irp)
{
- PEXTENDED_IO_STACK_LOCATION IoStack;
- PFILE_OBJECT FileObject;
- PMSFS_DEVICE_EXTENSION DeviceExtension;
- PMSFS_FCB Fcb;
- PMSFS_CCB Ccb;
- KIRQL oldIrql;
- PLIST_ENTRY current_entry;
- PMSFS_FCB current;
- PMAILSLOT_CREATE_PARAMETERS Buffer;
-
- DPRINT("MsfsCreateMailslot(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
-
- IoStack = (PEXTENDED_IO_STACK_LOCATION)IoGetCurrentIrpStackLocation(Irp);
- DeviceExtension = DeviceObject->DeviceExtension;
- FileObject = IoStack->FileObject;
- Buffer = IoStack->Parameters.CreateMailslot.Parameters;
-
- DPRINT("Mailslot name: %wZ\n", &FileObject->FileName);
-
- Fcb = ExAllocatePool(NonPagedPool, sizeof(MSFS_FCB));
- if (Fcb == NULL)
- {
- Irp->IoStatus.Status = STATUS_NO_MEMORY;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return(STATUS_NO_MEMORY);
- }
-
- Fcb->Name.Length = FileObject->FileName.Length;
- Fcb->Name.MaximumLength = Fcb->Name.Length + sizeof(UNICODE_NULL);
- Fcb->Name.Buffer = ExAllocatePool(NonPagedPool, Fcb->Name.MaximumLength);
- if (Fcb->Name.Buffer == NULL)
- {
- ExFreePool(Fcb);
-
- Irp->IoStatus.Status = STATUS_NO_MEMORY;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return(STATUS_NO_MEMORY);
- }
-
- RtlCopyUnicodeString(&Fcb->Name, &FileObject->FileName);
-
- Ccb = ExAllocatePool(NonPagedPool, sizeof(MSFS_CCB));
- if (Ccb == NULL)
- {
- ExFreePool(Fcb->Name.Buffer);
- ExFreePool(Fcb);
-
- Irp->IoStatus.Status = STATUS_NO_MEMORY;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return(STATUS_NO_MEMORY);
- }
-
- Fcb->ReferenceCount = 0;
- InitializeListHead(&Fcb->CcbListHead);
- KeInitializeSpinLock(&Fcb->CcbListLock);
-
- Fcb->MaxMessageSize = Buffer->MaximumMessageSize;
- Fcb->MessageCount = 0;
- Fcb->TimeOut = Buffer->ReadTimeout;
- KeInitializeEvent(&Fcb->MessageEvent,
- NotificationEvent,
- FALSE);
-
- InitializeListHead(&Fcb->MessageListHead);
- KeInitializeSpinLock(&Fcb->MessageListLock);
-
- KeLockMutex(&DeviceExtension->FcbListLock);
- current_entry = DeviceExtension->FcbListHead.Flink;
- while (current_entry != &DeviceExtension->FcbListHead)
- {
- current = CONTAINING_RECORD(current_entry,
- MSFS_FCB,
- FcbListEntry);
-
- if (!RtlCompareUnicodeString(&Fcb->Name, ¤t->Name, TRUE))
- {
- break;
- }
-
- current_entry = current_entry->Flink;
- }
-
- if (current_entry != &DeviceExtension->FcbListHead)
- {
- ExFreePool(Fcb->Name.Buffer);
- ExFreePool(Fcb);
-
- Fcb = current;
- }
- else
- {
- InsertTailList(&DeviceExtension->FcbListHead,
- &Fcb->FcbListEntry);
- }
+ PEXTENDED_IO_STACK_LOCATION IoStack;
+ PFILE_OBJECT FileObject;
+ PMSFS_DEVICE_EXTENSION DeviceExtension;
+ PMSFS_FCB Fcb;
+ PMSFS_CCB Ccb;
+ KIRQL oldIrql;
+ PLIST_ENTRY current_entry;
+ PMSFS_FCB current;
+ PMAILSLOT_CREATE_PARAMETERS Buffer;
+
+ DPRINT("MsfsCreateMailslot(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
+
+ IoStack = (PEXTENDED_IO_STACK_LOCATION)IoGetCurrentIrpStackLocation(Irp);
+ DeviceExtension = DeviceObject->DeviceExtension;
+ FileObject = IoStack->FileObject;
+ Buffer = IoStack->Parameters.CreateMailslot.Parameters;
+
+ DPRINT("Mailslot name: %wZ\n", &FileObject->FileName);
+
+ Fcb = ExAllocatePool(NonPagedPool, sizeof(MSFS_FCB));
+ if (Fcb == NULL)
+ {
+ Irp->IoStatus.Status = STATUS_NO_MEMORY;
+ Irp->IoStatus.Information = 0;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_NO_MEMORY;
+ }
+
+ Fcb->Name.Length = FileObject->FileName.Length;
+ Fcb->Name.MaximumLength = Fcb->Name.Length + sizeof(UNICODE_NULL);
+ Fcb->Name.Buffer = ExAllocatePool(NonPagedPool, Fcb->Name.MaximumLength);
+ if (Fcb->Name.Buffer == NULL)
+ {
+ ExFreePool(Fcb);
+
+ Irp->IoStatus.Status = STATUS_NO_MEMORY;
+ Irp->IoStatus.Information = 0;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_NO_MEMORY;
+ }
+
+ RtlCopyUnicodeString(&Fcb->Name, &FileObject->FileName);
+
+ Ccb = ExAllocatePool(NonPagedPool, sizeof(MSFS_CCB));
+ if (Ccb == NULL)
+ {
+ ExFreePool(Fcb->Name.Buffer);
+ ExFreePool(Fcb);
+
+ Irp->IoStatus.Status = STATUS_NO_MEMORY;
+ Irp->IoStatus.Information = 0;
- KeAcquireSpinLock(&Fcb->CcbListLock, &oldIrql);
- InsertTailList(&Fcb->CcbListHead, &Ccb->CcbListEntry);
- KeReleaseSpinLock(&Fcb->CcbListLock, oldIrql);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
- Fcb->ReferenceCount++;
- Fcb->ServerCcb = Ccb;
- Ccb->Fcb = Fcb;
+ return STATUS_NO_MEMORY;
+ }
- KeUnlockMutex(&DeviceExtension->FcbListLock);
+ Fcb->ReferenceCount = 0;
+ InitializeListHead(&Fcb->CcbListHead);
+ KeInitializeSpinLock(&Fcb->CcbListLock);
- FileObject->FsContext = Fcb;
- FileObject->FsContext2 = Ccb;
- FileObject->Flags |= FO_MAILSLOT;
+ Fcb->MaxMessageSize = Buffer->MaximumMessageSize;
+ Fcb->MessageCount = 0;
+ Fcb->TimeOut = Buffer->ReadTimeout;
+ KeInitializeEvent(&Fcb->MessageEvent,
+ NotificationEvent,
+ FALSE);
- Irp->IoStatus.Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = 0;
+ InitializeListHead(&Fcb->MessageListHead);
+ KeInitializeSpinLock(&Fcb->MessageListLock);
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ KeLockMutex(&DeviceExtension->FcbListLock);
+ current_entry = DeviceExtension->FcbListHead.Flink;
+ while (current_entry != &DeviceExtension->FcbListHead)
+ {
+ current = CONTAINING_RECORD(current_entry,
+ MSFS_FCB,
+ FcbListEntry);
- return(STATUS_SUCCESS);
+ if (!RtlCompareUnicodeString(&Fcb->Name, ¤t->Name, TRUE))
+ break;
+
+ current_entry = current_entry->Flink;
+ }
+
+ if (current_entry != &DeviceExtension->FcbListHead)
+ {
+ ExFreePool(Fcb->Name.Buffer);
+ ExFreePool(Fcb);
+
+ Fcb = current;
+ }
+ else
+ {
+ InsertTailList(&DeviceExtension->FcbListHead,
+ &Fcb->FcbListEntry);
+ }
+
+ KeAcquireSpinLock(&Fcb->CcbListLock, &oldIrql);
+ InsertTailList(&Fcb->CcbListHead, &Ccb->CcbListEntry);
+ KeReleaseSpinLock(&Fcb->CcbListLock, oldIrql);
+
+ Fcb->ReferenceCount++;
+ Fcb->ServerCcb = Ccb;
+ Ccb->Fcb = Fcb;
+
+ KeUnlockMutex(&DeviceExtension->FcbListLock);
+
+ FileObject->FsContext = Fcb;
+ FileObject->FsContext2 = Ccb;
+ FileObject->Flags |= FO_MAILSLOT;
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_SUCCESS;
}
NTSTATUS DEFAULTAPI
MsfsClose(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+ PIRP Irp)
{
- PIO_STACK_LOCATION IoStack;
- PFILE_OBJECT FileObject;
- PMSFS_DEVICE_EXTENSION DeviceExtension;
- PMSFS_FCB Fcb;
- PMSFS_CCB Ccb;
- PMSFS_MESSAGE Message;
- KIRQL oldIrql;
+ PIO_STACK_LOCATION IoStack;
+ PFILE_OBJECT FileObject;
+ PMSFS_DEVICE_EXTENSION DeviceExtension;
+ PMSFS_FCB Fcb;
+ PMSFS_CCB Ccb;
+ PMSFS_MESSAGE Message;
+ KIRQL oldIrql;
+
+ DPRINT("MsfsClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
- DPRINT("MsfsClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ DeviceExtension = DeviceObject->DeviceExtension;
+ FileObject = IoStack->FileObject;
- IoStack = IoGetCurrentIrpStackLocation(Irp);
- DeviceExtension = DeviceObject->DeviceExtension;
- FileObject = IoStack->FileObject;
+ KeLockMutex(&DeviceExtension->FcbListLock);
- KeLockMutex(&DeviceExtension->FcbListLock);
+ if (DeviceExtension->FcbListHead.Flink == &DeviceExtension->FcbListHead)
+ {
+ KeUnlockMutex(&DeviceExtension->FcbListLock);
- if (DeviceExtension->FcbListHead.Flink == &DeviceExtension->FcbListHead)
- {
- KeUnlockMutex(&DeviceExtension->FcbListLock);
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+ }
- return(STATUS_SUCCESS);
- }
+ Fcb = FileObject->FsContext;
+ Ccb = FileObject->FsContext2;
- Fcb = FileObject->FsContext;
- Ccb = FileObject->FsContext2;
+ DPRINT("Mailslot name: %wZ\n", &Fcb->Name);
- DPRINT("Mailslot name: %wZ\n", &Fcb->Name);
+ Fcb->ReferenceCount--;
+ if (Fcb->ServerCcb == Ccb)
+ {
+ /* delete all messages from message-list */
+ KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
- Fcb->ReferenceCount--;
- if (Fcb->ServerCcb == Ccb)
- {
- /* delete all messages from message-list */
- KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
+ while (Fcb->MessageListHead.Flink != &Fcb->MessageListHead)
+ {
+ Message = CONTAINING_RECORD(Fcb->MessageListHead.Flink,
+ MSFS_MESSAGE,
+ MessageListEntry);
+ RemoveEntryList(Fcb->MessageListHead.Flink);
+ ExFreePool(Message);
+ }
- while (Fcb->MessageListHead.Flink != &Fcb->MessageListHead)
- {
- Message = CONTAINING_RECORD(Fcb->MessageListHead.Flink,
- MSFS_MESSAGE,
- MessageListEntry);
- RemoveEntryList(Fcb->MessageListHead.Flink);
- ExFreePool(Message);
- }
- Fcb->MessageCount = 0;
+ Fcb->MessageCount = 0;
- KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
- Fcb->ServerCcb = NULL;
- }
+ KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
+ Fcb->ServerCcb = NULL;
+ }
- KeAcquireSpinLock(&Fcb->CcbListLock, &oldIrql);
- RemoveEntryList(&Ccb->CcbListEntry);
- KeReleaseSpinLock(&Fcb->CcbListLock, oldIrql);
- ExFreePool(Ccb);
- FileObject->FsContext2 = NULL;
+ KeAcquireSpinLock(&Fcb->CcbListLock, &oldIrql);
+ RemoveEntryList(&Ccb->CcbListEntry);
+ KeReleaseSpinLock(&Fcb->CcbListLock, oldIrql);
+ ExFreePool(Ccb);
+ FileObject->FsContext2 = NULL;
- if (Fcb->ReferenceCount == 0)
- {
- DPRINT1("ReferenceCount == 0: Deleting mailslot data\n");
- RemoveEntryList(&Fcb->FcbListEntry);
- ExFreePool(Fcb->Name.Buffer);
- ExFreePool(Fcb);
- }
+ if (Fcb->ReferenceCount == 0)
+ {
+ DPRINT1("ReferenceCount == 0: Deleting mailslot data\n");
+ RemoveEntryList(&Fcb->FcbListEntry);
+ ExFreePool(Fcb->Name.Buffer);
+ ExFreePool(Fcb);
+ }
- KeUnlockMutex(&DeviceExtension->FcbListLock);
+ KeUnlockMutex(&DeviceExtension->FcbListLock);
- Irp->IoStatus.Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return(STATUS_SUCCESS);
+ return STATUS_SUCCESS;
}
/* EOF */