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); }
static NTSTATUS SrvTreeRundownFileRbTreeVisit( PVOID pKey, PVOID pData, PVOID pUserData, PBOOLEAN pbContinue ) { PLWIO_SRV_FILE pFile = (PLWIO_SRV_FILE)pData; if (pFile) { SrvFileRundown(pFile); } *pbContinue = TRUE; return STATUS_SUCCESS; }