/// <summary> /// Tries to recover from an unknown handle. /// </summary> /// <param name="request">The request for the unknown key handle to try to virtualize.</param> /// <returns></returns> private RegistryBase TryRecoverUnknownHandle(RegistryRequest request) { request.KeyFullPath = HostRegistry.GetKeyNameByHandle(request.Handle); if (request.KeyFullPath == null) { EngineCore.Log.Error("Unknown registry key handle => {0}", request.Handle); return(null); } EngineCore.Log.Warning("Recovering from unknown registry key handle => {0} => {1}", request.Handle, request.KeyFullPath); // Teach target about the recovered key handle. var recoveredHandle = request.Handle; var target = GetDefaultRegistryFor(request); Exception error = null; if (target.OpenKey(request) == NativeResultCode.Success) { try { target.AddAlias(request.Handle, recoveredHandle); HostRegistry.CloseKey(recoveredHandle); return(target); } catch (ApplicationException e) { error = e; } } EngineCore.Log.Error("Unable to recover from unknown registry key handle => {0}", error, request.Handle, request.KeyFullPath); return(null); }
public NativeResultCode CloseKey(uint hKey) { var request = new RegistryRequest { Handle = hKey }; var registry = _switch.GetRegistryFor(request, false); if (registry != null) { return(registry.CloseKey(request)); } return(HostRegistry.CloseKey(hKey) ? NativeResultCode.Success : NativeResultCode.InvalidHandle); }