/// <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); }