- 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;