VOID NTAPI NpDeleteFcb(IN PNP_FCB Fcb, IN PLIST_ENTRY ListEntry) { PNP_DCB Dcb; PAGED_CODE(); Dcb = Fcb->ParentDcb; if (Fcb->CurrentInstances) NpBugCheck(0, 0, 0); NpCancelWaiter(&NpVcb->WaitQueue, &Fcb->FullName, STATUS_OBJECT_NAME_NOT_FOUND, ListEntry); RemoveEntryList(&Fcb->DcbEntry); if (Fcb->SecurityDescriptor) { ObDereferenceSecurityDescriptor(Fcb->SecurityDescriptor, 1); } RtlRemoveUnicodePrefix(&NpVcb->PrefixTable, &Fcb->PrefixTableEntry); ExFreePool(Fcb->FullName.Buffer); ExFreePool(Fcb); NpCheckForNotify(Dcb, TRUE, ListEntry); }
NTSTATUS NTAPI NpSetListeningPipeState(IN PNP_CCB Ccb, IN PIRP Irp, IN PLIST_ENTRY List) { NTSTATUS Status; switch (Ccb->NamedPipeState) { case FILE_PIPE_DISCONNECTED_STATE: Status = NpCancelWaiter(&NpVcb->WaitQueue, &Ccb->Fcb->FullName, STATUS_SUCCESS, List); if (!NT_SUCCESS(Status)) return Status; // // Drop down on purpose // case FILE_PIPE_LISTENING_STATE: if (Ccb->CompletionMode[FILE_PIPE_SERVER_END] == FILE_PIPE_COMPLETE_OPERATION) { Ccb->NamedPipeState = FILE_PIPE_LISTENING_STATE; return STATUS_PIPE_LISTENING; } IoSetCancelRoutine(Irp, NpCancelListeningQueueIrp); if (Irp->Cancel && IoSetCancelRoutine(Irp, NULL)) { return STATUS_CANCELLED; } Ccb->NamedPipeState = FILE_PIPE_LISTENING_STATE; IoMarkIrpPending(Irp); InsertTailList(&Ccb->IrpList, &Irp->Tail.Overlay.ListEntry); return STATUS_PENDING; case FILE_PIPE_CONNECTED_STATE: Status = STATUS_PIPE_CONNECTED; break; case FILE_PIPE_CLOSING_STATE: Status = STATUS_PIPE_CLOSING; break; default: NpBugCheck(Ccb->NamedPipeState, 0, 0); break; } return Status; }