Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 242 of file create.c.
{ 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); IoStack = IoGetCurrentIrpStackLocation(Irp); DeviceExtension = DeviceObject->DeviceExtension; FileObject = IoStack->FileObject; KeLockMutex(&DeviceExtension->FcbListLock); if (DeviceExtension->FcbListHead.Flink == &DeviceExtension->FcbListHead) { KeUnlockMutex(&DeviceExtension->FcbListLock); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } Fcb = FileObject->FsContext; Ccb = FileObject->FsContext2; DPRINT("Mailslot name: %wZ\n", &Fcb->Name); 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); } Fcb->MessageCount = 0; KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql); Fcb->ServerCcb = NULL; } KeAcquireSpinLock(&Fcb->CcbListLock, &oldIrql); RemoveEntryList(&Ccb->CcbListEntry); KeReleaseSpinLock(&Fcb->CcbListLock, oldIrql); ExFreePool(Ccb); FileObject->FsContext2 = NULL; if (Fcb->ReferenceCount == 0) { DPRINT("ReferenceCount == 0: Deleting mailslot data\n"); RemoveEntryList(&Fcb->FcbListEntry); ExFreePool(Fcb->Name.Buffer); ExFreePool(Fcb); } KeUnlockMutex(&DeviceExtension->FcbListLock); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; }