static VOID SrvTreeFileRelease( PVOID pFile ) { SrvFileRelease((PLWIO_SRV_FILE)pFile); }
static VOID SrvFreeOpenState( PSRV_OPEN_STATE_SMB_V1 pOpenState ) { if (pOpenState->pAcb && pOpenState->pAcb->AsyncCancelContext) { IoDereferenceAsyncCancelContext( &pOpenState->pAcb->AsyncCancelContext); } if (pOpenState->pEcpList) { IoRtlEcpListFree(&pOpenState->pEcpList); } // TODO: Free the following if set // pSecurityDescriptor; // pSecurityQOS; if (pOpenState->pFilename) { SRV_FREE_UNICODE_STRING(&pOpenState->pFilename->Name); SrvFreeMemory(pOpenState->pFilename); } if (pOpenState->hFile) { IoCloseFile(pOpenState->hFile); } if (pOpenState->pFile) { SrvFileResetOplockState(pOpenState->pFile); SrvFileRundown(pOpenState->pFile); SrvFileRelease(pOpenState->pFile); } if (pOpenState->pTree) { SrvTreeRelease(pOpenState->pTree); } if (pOpenState->pMutex) { pthread_mutex_destroy(&pOpenState->mutex); } SrvFreeMemory(pOpenState); }
NTSTATUS SrvTreeCreateFile( PLWIO_SRV_TREE pTree, PWSTR pwszFilename, PIO_FILE_HANDLE phFile, PIO_FILE_NAME* ppFilename, ACCESS_MASK desiredAccess, LONG64 allocationSize, FILE_ATTRIBUTES fileAttributes, FILE_SHARE_FLAGS shareAccess, FILE_CREATE_DISPOSITION createDisposition, FILE_CREATE_OPTIONS createOptions, PLWIO_SRV_FILE* ppFile ) { NTSTATUS ntStatus = 0; BOOLEAN bInLock = FALSE; PLWIO_SRV_FILE pFile = NULL; USHORT fid = 0; LWIO_LOCK_RWMUTEX_EXCLUSIVE(bInLock, &pTree->mutex); ntStatus = SrvTreeAcquireFileId_inlock( pTree, &fid); BAIL_ON_NT_STATUS(ntStatus); ntStatus = SrvFileCreate( fid, pwszFilename, phFile, ppFilename, desiredAccess, allocationSize, fileAttributes, shareAccess, createDisposition, createOptions, &pFile); BAIL_ON_NT_STATUS(ntStatus); ntStatus = LwRtlRBTreeAdd( pTree->pFileCollection, &pFile->fid, pFile); BAIL_ON_NT_STATUS(ntStatus); pFile->resource.pAttributes->treeId.usTid = pTree->tid; pFile->resource.pAttributes->sessionId.usUid = pTree->uid; pFile->resource.pAttributes->ulConnectionResourceId = pTree->ulConnectionResourceId; pTree->ulNumOpenFiles++; *ppFile = SrvFileAcquire(pFile); cleanup: LWIO_UNLOCK_RWMUTEX(bInLock, &pTree->mutex); return ntStatus; error: *ppFile = NULL; if (pFile) { SrvFileRelease(pFile); } goto cleanup; }
static VOID SrvFreeOpenState( PSRV_OPEN_STATE_SMB_V1 pOpenState ) { if (pOpenState->pAcb && pOpenState->pAcb->AsyncCancelContext) { IoDereferenceAsyncCancelContext( &pOpenState->pAcb->AsyncCancelContext); } if (pOpenState->pEcpList) { IoRtlEcpListFree(&pOpenState->pEcpList); } // TODO: Free the following if set // pSecurityDescriptor; // pSecurityQOS; if (pOpenState->pFilename) { if (pOpenState->pFilename->FileName) { SrvFreeMemory(pOpenState->pFilename->FileName); } SrvFreeMemory(pOpenState->pFilename); } if (pOpenState->hFile) { IoCloseFile(pOpenState->hFile); } if (pOpenState->bRemoveFileFromTree) { NTSTATUS ntStatus2 = 0; SrvFileResetOplockState(pOpenState->pFile); ntStatus2 = SrvTreeRemoveFile( pOpenState->pTree, pOpenState->pFile->fid); if (ntStatus2) { LWIO_LOG_ERROR("Failed to remove file from tree [Tid:%d][Fid:%d][code:%d]", pOpenState->pTree->tid, pOpenState->pFile->fid, ntStatus2); } } if (pOpenState->pFile) { SrvFileRelease(pOpenState->pFile); } if (pOpenState->pTree) { SrvTreeRelease(pOpenState->pTree); } if (pOpenState->pMutex) { pthread_mutex_destroy(&pOpenState->mutex); } SrvFreeMemory(pOpenState); }