void SqliteCacheFreeKeyCtxHashEntry( IN const REG_HASH_ENTRY* pEntry ) { PREG_KEY_CONTEXT pKeyResult = (PREG_KEY_CONTEXT)pEntry->pValue; if (pKeyResult) { SqliteSafeFreeKeyContext(pKeyResult); } }
NTSTATUS SqliteCreateKeyContext( IN PREG_DB_KEY pRegEntry, OUT PREG_KEY_CONTEXT* ppKeyResult ) { NTSTATUS status = STATUS_SUCCESS; PREG_KEY_CONTEXT pKeyResult = NULL; BAIL_ON_INVALID_REG_ENTRY(pRegEntry); status = LW_RTL_ALLOCATE((PVOID*)&pKeyResult, REG_KEY_CONTEXT, sizeof(*pKeyResult)); BAIL_ON_NT_STATUS(status); pKeyResult->refCount = 1; pthread_rwlock_init(&pKeyResult->mutex, NULL); pKeyResult->pMutex = &pKeyResult->mutex; status = LwRtlWC16StringDuplicate(&pKeyResult->pwszKeyName, pRegEntry->pwszFullKeyName); BAIL_ON_NT_STATUS(status); status = SqliteGetParentKeyName(pKeyResult->pwszKeyName, (wchar16_t)'\\',&pKeyResult->pwszParentKeyName); BAIL_ON_NT_STATUS(status); pKeyResult->qwId = pRegEntry->version.qwDbId; pKeyResult->qwSdId = pRegEntry->qwAclIndex; // Cache ACL if (pRegEntry->ulSecDescLength) { status = LW_RTL_ALLOCATE((PVOID*)&pKeyResult->pSecurityDescriptor, VOID, pRegEntry->ulSecDescLength); BAIL_ON_NT_STATUS(status); memcpy(pKeyResult->pSecurityDescriptor, pRegEntry->pSecDescRel, pRegEntry->ulSecDescLength); pKeyResult->ulSecDescLength = pRegEntry->ulSecDescLength; pKeyResult->bHasSdInfo = TRUE; } *ppKeyResult = pKeyResult; cleanup: return status; error: SqliteSafeFreeKeyContext(pKeyResult); *ppKeyResult = NULL; goto cleanup; }