NTSTATUS SqliteOpenKeyInternal_inlock_inDblock( IN OPTIONAL HANDLE handle, IN PCWSTR pwszFullKeyName, // Full Key Path IN ACCESS_MASK AccessDesired, OUT OPTIONAL PREG_KEY_HANDLE* ppKeyHandle ) { NTSTATUS status = STATUS_SUCCESS; PREG_SRV_API_STATE pServerState = (PREG_SRV_API_STATE)handle; PREG_DB_KEY pRegEntry = NULL; PREG_KEY_HANDLE pKeyHandle = NULL; PREG_KEY_CONTEXT pKeyCtx = NULL; BAIL_ON_NT_INVALID_STRING(pwszFullKeyName); pKeyCtx = SqliteCacheLocateActiveKey_inlock(pwszFullKeyName); if (!pKeyCtx) { status = RegDbOpenKey_inlock(ghCacheConnection, pwszFullKeyName, &pRegEntry); BAIL_ON_NT_STATUS(status); status = SqliteCreateKeyContext(pRegEntry, &pKeyCtx); BAIL_ON_NT_STATUS(status); // Cache this new key in gActiveKeyList status = SqliteCacheInsertActiveKey_inlock(pKeyCtx); BAIL_ON_NT_STATUS(status); } status = SqliteCreateKeyHandle(pServerState ? pServerState->pToken : NULL, AccessDesired, pKeyCtx, &pKeyHandle); BAIL_ON_NT_STATUS(status); pKeyCtx = NULL; *ppKeyHandle = pKeyHandle; cleanup: SqliteReleaseKeyContext_inlock(pKeyCtx); RegDbSafeFreeEntryKey(&pRegEntry); return status; error: SqliteSafeFreeKeyHandle_inlock(pKeyHandle); *ppKeyHandle = NULL; goto cleanup; }
/*Find whether this key has already been in active Key list, * If not, create key context and add the active key to the list * Otherwise, increment the existing active key reference count by 1 */ PREG_KEY_CONTEXT SqliteCacheLocateActiveKey( IN PCWSTR pwszKeyName ) { PREG_KEY_CONTEXT pKeyResult = NULL; BOOLEAN bInLock = FALSE; LWREG_LOCK_MUTEX(bInLock, &gActiveKeyList.mutex); pKeyResult = SqliteCacheLocateActiveKey_inlock(pwszKeyName); LWREG_UNLOCK_MUTEX(bInLock, &gActiveKeyList.mutex); return pKeyResult; }
void SqliteCacheResetKeyValueInfo_inlock( IN PCWSTR pwszKeyName ) { PREG_KEY_CONTEXT pKeyResult = SqliteCacheLocateActiveKey_inlock(pwszKeyName); if (pKeyResult) { // Todo: we can reflect activeKey to have the most current information, // For now, set the bHasSubKeyInfo to false to force it grab information from db SqliteResetValueInfo(pKeyResult); } SqliteReleaseKeyContext_inlock(pKeyResult); return; }
NTSTATUS SqliteDeleteActiveKey_inlock( IN PCWSTR pwszKeyName ) { NTSTATUS status = STATUS_SUCCESS; PREG_KEY_CONTEXT pFoundKey = NULL; pFoundKey = SqliteCacheLocateActiveKey_inlock(pwszKeyName); if (pFoundKey) { status = STATUS_RESOURCE_IN_USE; BAIL_ON_NT_STATUS(status); } cleanup: SqliteReleaseKeyContext_inlock(pFoundKey); return status; error: goto cleanup; }