NTSTATUS NpfsCreateFCB( PUNICODE_STRING pUnicodeString, PNPFS_FCB * ppFCB ) { NTSTATUS ntStatus = 0; PNPFS_FCB pFCB = NULL; ntStatus = NpfsAllocateMemory( sizeof(*pFCB), OUT_PPVOID(&pFCB) ); BAIL_ON_NT_STATUS(ntStatus); LwListInit(&pFCB->link); LwListInit(&pFCB->pipeList); ntStatus = RtlUnicodeStringDuplicate( &pFCB->PipeName, pUnicodeString ); BAIL_ON_NT_STATUS(ntStatus); pthread_rwlock_init(&pFCB->PipeListRWLock, NULL); pFCB->lRefCount = 1; pFCB->MaxNumberOfInstances = 0xFF; // Number of currently available instances pFCB->CurrentNumberOfInstances = 0xFF; // TODO: This should be the default type pFCB->NamedPipeType = FILE_PIPE_MESSAGE_TYPE; LwListInsertBefore(&gFCBList, &pFCB->link); *ppFCB = pFCB; return ntStatus; error: if (pFCB) { NpfsFreeMemory(pFCB); } *ppFCB = NULL; return ntStatus; }
VOID RdrContinueContextList( PLW_LIST_LINKS pList, NTSTATUS status, PVOID pParam ) { PRDR_OP_CONTEXT pContext = NULL; PLW_LIST_LINKS pLink = NULL; PLW_LIST_LINKS pNext = NULL; for (pLink = pList->Next; pLink != pList; pLink = pNext) { pNext = pLink->Next; pContext = LW_STRUCT_FROM_FIELD(pLink, RDR_OP_CONTEXT, Link); LwListRemove(pLink); if (RdrContinueContext(pContext, status, pParam)) { LwListInsertBefore(pNext, pLink); } } }
LW_NTSTATUS LwIoSetPathCreds( IN LW_PUNICODE_STRING PathPrefix, IN OPTIONAL LW_PIO_CREDS pCreds ) { LW_NTSTATUS Status = STATUS_SUCCESS; PIO_PATH_CREDS pPathCreds = NULL; PIO_CREDS pCredCopy = NULL; BOOL bInLock = FALSE; LWIO_LOCK_MUTEX(bInLock, &gLock); Status = LwIoFindPathCreds(PathPrefix, TRUE, &pPathCreds); BAIL_ON_NT_STATUS(Status); if (pPathCreds) { Status = LwIoCopyCreds(pCreds, &pCredCopy); BAIL_ON_NT_STATUS(Status); if (pPathCreds->pCreds) { LwIoDeleteCreds(pPathCreds->pCreds); } pPathCreds->pCreds = pCredCopy; pCredCopy = NULL; pPathCreds = NULL; } else if (pCreds) { Status = RTL_ALLOCATE(&pPathCreds, IO_PATH_CREDS, sizeof(IO_PATH_CREDS)); BAIL_ON_NT_STATUS(Status); LwListInit(&pPathCreds->link); Status = LwIoNormalizePath(PathPrefix, &pPathCreds->PathPrefix); BAIL_ON_NT_STATUS(Status); Status = LwIoCopyCreds(pCreds, &pPathCreds->pCreds); BAIL_ON_NT_STATUS(Status); LwListInsertBefore(&gPathCreds, &pPathCreds->link); pPathCreds = NULL; } cleanup: LWIO_UNLOCK_MUTEX(bInLock, &gLock); if (pCredCopy) { LwIoDeleteCreds(pCredCopy); } if (pPathCreds) { LwIoDeletePathCreds(pPathCreds); } return Status; error: goto cleanup; }