Home | Info | Community | Development | myReactOS | Contact Us
[static]
Definition at line 200 of file fsctrl.c.
Referenced by NpfsFileSystemControl().
{ NTSTATUS Status; PNPFS_FCB Fcb; PNPFS_CCB OtherSide; BOOLEAN Server; DPRINT("NpfsDisconnectPipe()\n"); /* Fail, if the CCB is not a pipe CCB */ if (Ccb->Type != CCB_PIPE) { DPRINT("Not a pipe\n"); return STATUS_ILLEGAL_FUNCTION; } /* Fail, if the CCB is not a server end CCB */ if (Ccb->PipeEnd != FILE_PIPE_SERVER_END) { DPRINT("Not the server end\n"); return STATUS_ILLEGAL_FUNCTION; } Fcb = Ccb->Fcb; KeLockMutex(&Fcb->CcbListLock); if (Ccb->PipeState == FILE_PIPE_DISCONNECTED_STATE) { DPRINT("Pipe is already disconnected\n"); Status = STATUS_PIPE_DISCONNECTED; } else if ((!Ccb->OtherSide) && (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)) { ExAcquireFastMutex(&Ccb->DataListLock); Ccb->PipeState = FILE_PIPE_DISCONNECTED_STATE; ExReleaseFastMutex(&Ccb->DataListLock); Status = STATUS_SUCCESS; } else if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE) { Server = (Ccb->PipeEnd == FILE_PIPE_SERVER_END); OtherSide = Ccb->OtherSide; //Ccb->OtherSide = NULL; Ccb->PipeState = FILE_PIPE_DISCONNECTED_STATE; /* Lock the server first */ if (Server) { ExAcquireFastMutex(&Ccb->DataListLock); ExAcquireFastMutex(&OtherSide->DataListLock); } else { ExAcquireFastMutex(&OtherSide->DataListLock); ExAcquireFastMutex(&Ccb->DataListLock); } OtherSide->PipeState = FILE_PIPE_DISCONNECTED_STATE; //OtherSide->OtherSide = NULL; /* * Signaling the write event. If is possible that an other * thread waits for an empty buffer. */ KeSetEvent(&OtherSide->ReadEvent, IO_NO_INCREMENT, FALSE); KeSetEvent(&OtherSide->WriteEvent, IO_NO_INCREMENT, FALSE); if (Server) { ExReleaseFastMutex(&OtherSide->DataListLock); ExReleaseFastMutex(&Ccb->DataListLock); } else { ExReleaseFastMutex(&Ccb->DataListLock); ExReleaseFastMutex(&OtherSide->DataListLock); } Status = STATUS_SUCCESS; } else if (Ccb->PipeState == FILE_PIPE_LISTENING_STATE) { PLIST_ENTRY Entry; PNPFS_WAITER_ENTRY WaitEntry = NULL; BOOLEAN Complete = FALSE; PIRP Irp = NULL; Entry = Ccb->Fcb->WaiterListHead.Flink; while (Entry != &Ccb->Fcb->WaiterListHead) { WaitEntry = CONTAINING_RECORD(Entry, NPFS_WAITER_ENTRY, Entry); if (WaitEntry->Ccb == Ccb) { RemoveEntryList(Entry); Irp = CONTAINING_RECORD(Entry, IRP, Tail.Overlay.DriverContext); Complete = (NULL != IoSetCancelRoutine(Irp, NULL)); break; } Entry = Entry->Flink; } if (Irp) { if (Complete) { Irp->IoStatus.Status = STATUS_PIPE_BROKEN; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); } } Ccb->PipeState = FILE_PIPE_DISCONNECTED_STATE; Status = STATUS_SUCCESS; } else if (Ccb->PipeState == FILE_PIPE_CLOSING_STATE) { Status = STATUS_PIPE_CLOSING; } else { Status = STATUS_UNSUCCESSFUL; } KeUnlockMutex(&Fcb->CcbListLock); return Status; }