NTSTATUS NpfsServerCloseHandle( PNPFS_CCB pSCB ) { NTSTATUS ntStatus = 0; PNPFS_PIPE pPipe = NULL; PNPFS_CCB pCCB = NULL; PLW_LIST_LINKS pLink = NULL; PNPFS_IRP_CONTEXT pReadContext = NULL; pPipe = pSCB->pPipe; ENTER_MUTEX(&pPipe->PipeMutex); pCCB = pPipe->pCCB; pPipe->PipeServerState = PIPE_SERVER_CLOSED; while (pCCB && !LwListIsEmpty(&pCCB->ReadIrpList)) { pLink = pCCB->ReadIrpList.Next; LwListRemove(pLink); pReadContext = LW_STRUCT_FROM_FIELD(pLink, NPFS_IRP_CONTEXT, Link); NpfsClientCompleteReadFile(pCCB, pReadContext); } pthread_cond_signal(&pPipe->PipeCondition); if (pPipe->PipeClientState == PIPE_CLIENT_CLOSED) { ntStatus = NpfsFreePipeContext(pPipe); BAIL_ON_NT_STATUS(ntStatus); } error: pPipe->pSCB = NULL; LEAVE_MUTEX(&pPipe->PipeMutex); NpfsReleaseCCB(pSCB); return ntStatus; }
NTSTATUS NpfsServerWriteFile_Connected( PNPFS_CCB pSCB, PNPFS_IRP_CONTEXT pIrpContext ) { NTSTATUS ntStatus = 0; PNPFS_PIPE pPipe = NULL; PNPFS_CCB pCCB = NULL; PVOID pBuffer = NULL; ULONG Length = 0; ULONG ulBytesTransferred = 0; PNPFS_IRP_CONTEXT pReadContext = NULL; PLW_LIST_LINKS pLink = NULL; switch (pIrpContext->pIrp->Type) { case IRP_TYPE_FS_CONTROL: pBuffer = pIrpContext->pIrp->Args.IoFsControl.InputBuffer; Length = pIrpContext->pIrp->Args.IoFsControl.InputBufferLength; break; default: pBuffer = pIrpContext->pIrp->Args.ReadWrite.Buffer; Length = pIrpContext->pIrp->Args.ReadWrite.Length; break; } pPipe = pSCB->pPipe; pCCB = pPipe->pCCB; ntStatus = NpfsEnqueueBuffer( &pCCB->mdlList, pBuffer, Length, &ulBytesTransferred ); BAIL_ON_NT_STATUS(ntStatus); while (!LwListIsEmpty(&pCCB->ReadIrpList) && !NpfsMdlListIsEmpty(&pCCB->mdlList)) { pLink = pCCB->ReadIrpList.Next; LwListRemove(pLink); pReadContext = LW_STRUCT_FROM_FIELD(pLink, NPFS_IRP_CONTEXT, Link); NpfsClientCompleteReadFile(pCCB, pReadContext); } pthread_cond_signal(&pPipe->PipeCondition); pIrpContext->pIrp->IoStatusBlock.BytesTransferred = ulBytesTransferred; error: pIrpContext->pIrp->IoStatusBlock.Status = ntStatus; return ntStatus; }