Esempio n. 1
0
        /// <summary>
        /// Returns the registry that must be used to handle te specified <see cref="RegistryRequest"/> with.
        /// </summary>
        /// <param name="request">The <see cref="RegistryRequest"/> to get the handling registry for.</param>
        /// <param name="recoverHandle">Indicates whether or not a possible unknown <see cref="RegistryRequest.Handle"/> should be recovered and virtualized.</param>
        /// <returns></returns>
        public RegistryBase GetRegistryFor(RegistryRequest request, bool recoverHandle)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }
            RegistryBase result = null;

            if (_virtualRegistry.IsKnownKey(request))
            {
                result = _virtualRegistry;
            }
            else if (_transparentRegistry.IsKnownKey(request))
            {
                result = _transparentRegistry;
            }
            else if (HiveHelper.IsHiveHandle(request.Handle))
            {
                request.KeyFullPath = HiveHelper.GetHive(request.Handle).AsRegistryHiveName();
                result = GetDefaultRegistryFor(request);
            }
            else if (recoverHandle)
            {
                // Unknown handle, and allowed to be recovered and virtualized.
                result = TryRecoverUnknownHandle(request);
            }
            else
            {
                EngineCore.Log.Error("Unknown registry key handle => {0}", request.Handle);
            }
            request.VirtualizationType = GetVirtualizationType(request.KeyFullPath);
            return(result);
        }