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; }