+ KeAcquireSpinLock(&Pipe->FcbListLock, &oldIrql);
+ if (Fcb->OtherSide)
+ {
+ RemoveEntryList(&Fcb->OtherSide->FcbListEntry);
+ }
+ RemoveEntryList(&Fcb->FcbListEntry);
+ KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql);
+ if (Fcb->OtherSide)
+ {
+ KeAcquireSpinLock(&Fcb->OtherSide->DataListLock, &oldIrql);
+ while (!IsListEmpty(&Fcb->OtherSide->DataListHead))
+ {
+ CurrentEntry = RemoveHeadList(&Fcb->OtherSide->DataListHead);
+ Current = CONTAINING_RECORD(CurrentEntry, NPFS_PIPE_DATA, ListEntry);
+
+ NpfsFreePipeData(Current);
+ }
+ KeReleaseSpinLock(&Fcb->OtherSide->DataListLock, oldIrql);
+ ExFreePool(Fcb->OtherSide);
+ }
+
+ KeAcquireSpinLock(&Fcb->DataListLock, &oldIrql);
+ while (!IsListEmpty(&Fcb->DataListHead))
+ {
+ CurrentEntry = RemoveHeadList(&Fcb->DataListHead);
+ Current = CONTAINING_RECORD(CurrentEntry, NPFS_PIPE_DATA, ListEntry);
+ NpfsFreePipeData(Current);
+ }
+ KeReleaseSpinLock(&Fcb->DataListLock, oldIrql);
+ ExFreePool(Fcb);