NTSTATUS SrvElementsResourcesInit( VOID ) { NTSTATUS ntStatus = STATUS_SUCCESS; memset( &gSrvElements.resources, 0, sizeof(gSrvElements.resources)); pthread_rwlock_init(&gSrvElements.resources.mutex, NULL); gSrvElements.resources.pMutex = &gSrvElements.resources.mutex; ntStatus = LwRtlRBTreeCreate( &SrvElementsResourceCompare, NULL, NULL, &gSrvElements.resources.pResources); BAIL_ON_NT_STATUS(ntStatus); error: return ntStatus; }
NTSTATUS SrvSessionCreate( USHORT uid, PLWIO_SRV_SESSION* ppSession ) { NTSTATUS ntStatus = 0; PLWIO_SRV_SESSION pSession = NULL; LWIO_LOG_DEBUG("Creating session [uid:%u]", uid); ntStatus = SrvAllocateMemory( sizeof(LWIO_SRV_SESSION), (PVOID*)&pSession); BAIL_ON_NT_STATUS(ntStatus); pSession->refcount = 1; pthread_rwlock_init(&pSession->mutex, NULL); pSession->pMutex = &pSession->mutex; pSession->uid = uid; ntStatus = WireGetCurrentNTTime(&pSession->llBirthTime); BAIL_ON_NT_STATUS(ntStatus); pSession->llLastActivityTime = pSession->llBirthTime; LWIO_LOG_DEBUG("Associating session [object:0x%x][uid:%u]", pSession, uid); ntStatus = LwRtlRBTreeCreate( &SrvSessionTreeCompare, NULL, &SrvSessionTreeRelease, &pSession->pTreeCollection); BAIL_ON_NT_STATUS(ntStatus); ntStatus = SrvFinderCreateRepository( &pSession->hFinderRepository); BAIL_ON_NT_STATUS(ntStatus); SRV_ELEMENTS_INCREMENT_SESSIONS; *ppSession = pSession; cleanup: return ntStatus; error: *ppSession = NULL; if (pSession) { SrvSessionRelease(pSession); } goto cleanup; }
NTSTATUS SrvFinderCreateRepository( OUT PHANDLE phFinderRepository ) { NTSTATUS ntStatus = 0; PSRV_FINDER_REPOSITORY pFinderRepository = NULL; ntStatus = SrvAllocateMemory( sizeof(SRV_FINDER_REPOSITORY), (PVOID*)&pFinderRepository); BAIL_ON_NT_STATUS(ntStatus); pFinderRepository->refCount = 1; pthread_mutex_init(&pFinderRepository->mutex, NULL); pFinderRepository->pMutex = &pFinderRepository->mutex; ntStatus = LwRtlRBTreeCreate( &SrvFinderCompareSearchSpaces, NULL, &SrvFinderFreeData, &pFinderRepository->pSearchSpaceCollection); BAIL_ON_NT_STATUS(ntStatus); *phFinderRepository = pFinderRepository; cleanup: return ntStatus; error: *phFinderRepository = NULL; if (pFinderRepository) { SrvFinderFreeRepository(pFinderRepository); } goto cleanup; }
NTSTATUS SrvTree2Create( PLWIO_SRV_SESSION_2 pSession, ULONG ulTid, PSRV_SHARE_INFO pShareInfo, PLWIO_SRV_TREE_2* ppTree ) { NTSTATUS ntStatus = 0; PLWIO_SRV_TREE_2 pTree = NULL; LWIO_LOG_DEBUG("Creating Tree [tid: %u]", ulTid); ntStatus = SrvAllocateMemory(sizeof(LWIO_SRV_TREE_2), (PVOID*)&pTree); BAIL_ON_NT_STATUS(ntStatus); pTree->refcount = 1; pthread_rwlock_init(&pTree->mutex, NULL); pTree->pMutex = &pTree->mutex; pTree->pSession = pSession;; SrvSession2Acquire(pSession); pTree->ulTid = ulTid; pTree->ullUid = pSession->ullUid; pTree->resource.resourceType = SRV_RESOURCE_TYPE_TREE; pTree->resource.pAttributes = &pTree->resourceAttrs; pTree->resource.pAttributes->protocolVersion = SMB_PROTOCOL_VERSION_2; pTree->resource.pAttributes->treeId.ulTid = pTree->ulTid; pTree->resource.pAttributes->sessionId.ullUid = pTree->ullUid; pTree->resource.pAttributes->ulConnectionResourceId = pSession->ulConnectionResourceId; LWIO_LOG_DEBUG("Associating Tree [object:0x%x][tid:%u]", pTree, ulTid); pTree->pShareInfo = pShareInfo; SrvShareAcquireInfo(pShareInfo); pTree->ullNextAvailableFid = 0xFFFFFFFF00000001LL; ntStatus = LwRtlRBTreeCreate( &SrvTree2FileCompare, NULL, &SrvTree2FileRelease, &pTree->pFileCollection); BAIL_ON_NT_STATUS(ntStatus); SRV_ELEMENTS_INCREMENT_TREE_CONNECTS; *ppTree = pTree; cleanup: return ntStatus; error: *ppTree = NULL; if (pTree) { SrvTree2Release(pTree); } goto cleanup; }
NTSTATUS SrvTreeCreate( USHORT tid, PSRV_SHARE_INFO pShareInfo, PLWIO_SRV_TREE* ppTree ) { NTSTATUS ntStatus = 0; PLWIO_SRV_TREE pTree = NULL; LWIO_LOG_DEBUG("Creating Tree [tid: %u]", tid); ntStatus = SrvAllocateMemory(sizeof(LWIO_SRV_TREE), (PVOID*)&pTree); BAIL_ON_NT_STATUS(ntStatus); pTree->refcount = 1; pthread_rwlock_init(&pTree->mutex, NULL); pTree->pMutex = &pTree->mutex; pTree->tid = tid; LWIO_LOG_DEBUG("Associating Tree [object:0x%x][tid:%u]", pTree, tid); pTree->pShareInfo = SrvShareAcquireInfo(pShareInfo); ntStatus = LwRtlRBTreeCreate( &SrvTreeFileCompare, NULL, &SrvTreeFileRelease, &pTree->pFileCollection); BAIL_ON_NT_STATUS(ntStatus); ntStatus = LwRtlRBTreeCreate( &SrvTreeAsyncStateCompare, NULL, &SrvTreeAsyncStateRelease, &pTree->pAsyncStateCollection); BAIL_ON_NT_STATUS(ntStatus); SRV_ELEMENTS_INCREMENT_TREE_CONNECTS; *ppTree = pTree; cleanup: return ntStatus; error: *ppTree = NULL; if (pTree) { SrvTreeRelease(pTree); } goto cleanup; }