NTSTATUS SrvSetStatSessionInfo( PSRV_EXEC_CONTEXT pExecContext, PLWIO_SRV_SESSION pSession ) { NTSTATUS ntStatus = STATUS_SUCCESS; if (pExecContext->pStatInfo) { SRV_STAT_SESSION_INFO statSessionInfo = { .pwszUserPrincipal = pSession->pwszClientPrincipalName, .ulUid = UINT32_MAX, .ulGid = UINT32_MAX, .ullSessionId = pSession->uid }; if (pSession->pIoSecurityContext) { NTSTATUS ntStatus2 = STATUS_SUCCESS; TOKEN_UNIX tokenUnix = { 0 }; ntStatus2 = RtlQueryAccessTokenUnixInformation( IoSecurityGetAccessToken(pSession->pIoSecurityContext), &tokenUnix); if (ntStatus2 == STATUS_SUCCESS) { statSessionInfo.ulUid = tokenUnix.Uid; statSessionInfo.ulGid = tokenUnix.Gid; } } ntStatus = SrvStatisticsSetSessionInfo( pExecContext->pStatInfo, &statSessionInfo); BAIL_ON_NT_STATUS(ntStatus); } error: return ntStatus; }
NTSTATUS PvfsAcquireAccessToken( PPVFS_CCB pCcb, PIO_CREATE_SECURITY_CONTEXT pIoSecCtx ) { NTSTATUS ntError= STATUS_UNSUCCESSFUL; pCcb->pUserToken = IoSecurityGetAccessToken(pIoSecCtx); if (pCcb->pUserToken == NULL) { ntError = STATUS_NO_TOKEN; BAIL_ON_NT_STATUS(ntError); } RtlReferenceAccessToken(pCcb->pUserToken); ntError = STATUS_SUCCESS; cleanup: return ntError; error: goto cleanup; }
NTSTATUS NpfsCommonCreate( PNPFS_IRP_CONTEXT pIrpContext, PIRP pIrp ) { NTSTATUS ntStatus = 0; PUNICODE_STRING pPipeName = &pIrpContext->pIrp->Args.Create.FileName.Name; PNPFS_FCB pFCB = NULL; PNPFS_PIPE pPipe = NULL; PNPFS_CCB pCCB = NULL; BOOLEAN bReleaseLock = FALSE; PNPFS_IRP_CONTEXT pConnectContext = NULL; ntStatus = NpfsValidateCreate(pIrpContext); BAIL_ON_NT_STATUS(ntStatus); ENTER_READER_RW_LOCK(&gServerLock); ntStatus = NpfsFindFCB(pPipeName, &pFCB); LEAVE_READER_RW_LOCK(&gServerLock); BAIL_ON_NT_STATUS(ntStatus); ntStatus = NpfsFindAvailablePipe(pFCB, &pPipe); BAIL_ON_NT_STATUS(ntStatus); ENTER_MUTEX(&pPipe->PipeMutex); bReleaseLock = TRUE; if (pPipe->PipeServerState != PIPE_SERVER_WAITING_FOR_CONNECTION) { ntStatus = STATUS_INVALID_SERVER_STATE; BAIL_ON_NT_STATUS(ntStatus); } ntStatus = NpfsCreateCCB(pIrpContext, pPipe, &pCCB); BAIL_ON_NT_STATUS(ntStatus); pPipe->PipeClientState = PIPE_CLIENT_CONNECTED; pPipe->pClientAccessToken = IoSecurityGetAccessToken(pIrp->Args.Create.SecurityContext); RtlReferenceAccessToken(pPipe->pClientAccessToken); ntStatus = NpfsCommonProcessCreateEcp(pIrpContext, pIrp, pCCB); BAIL_ON_NT_STATUS(ntStatus); /* Wake up blocking pipe waiters */ pthread_cond_signal(&pPipe->PipeCondition); /* If there is a pending connect IRP, grab it to complete once we leave the pipe mutex */ if (pPipe->pPendingServerConnect) { pConnectContext = pPipe->pPendingServerConnect; pPipe->pPendingServerConnect = NULL; pPipe->PipeServerState = PIPE_SERVER_CONNECTED; } LEAVE_MUTEX(&pPipe->PipeMutex); bReleaseLock = FALSE; if (pConnectContext) { pConnectContext->pIrp->IoStatusBlock.Status = STATUS_SUCCESS; IoIrpComplete(pConnectContext->pIrp); IO_FREE(&pConnectContext); } ntStatus = NpfsSetCCB(pIrpContext->pIrp->FileHandle, pCCB); BAIL_ON_NT_STATUS(ntStatus); pIrpContext->pIrp->IoStatusBlock.CreateResult = FILE_OPENED; cleanup: if (bReleaseLock) { LEAVE_MUTEX(&pPipe->PipeMutex); } if (pFCB) { NpfsReleaseFCB(pFCB); } if (pPipe) { NpfsReleasePipe(pPipe); } if (pCCB) { NpfsReleaseCCB(pCCB); } pIrpContext->pIrp->IoStatusBlock.Status = ntStatus; return ntStatus; error: pIrpContext->pIrp->IoStatusBlock.CreateResult = FILE_DOES_NOT_EXIST; goto cleanup; }