ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

static NTSTATUS NpfsDisconnectPipe ( PNPFS_CCB  Ccb) [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;
}

Generated on Sat May 26 2012 05:22:37 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.