private ApplyResourceChangeResult <RegistryKeyResource> DoCreate(
            ApplyResourceChangeInput <RegistryKeyResource> input)
        {
            var newRes = input.PlannedState;
            var pState = StateHelper.Deserialize <PrivateState>(input.PlannedPrivate)
                         ?? new PrivateState();

            _log.LogInformation($"Creating registry key at [{newRes.Root}][{newRes.Path}]");
            RegistryKey root   = RegUtil.ParseRootKey(newRes.Root);
            RegistryKey newKey = root.OpenSubKey(newRes.Path, true);

            if (newKey == null)
            {
                _log.LogInformation("Existing key does not exist, creating");
                newKey = root.CreateSubKey(newRes.Path, true);
                pState.RegistryKeyCreated = true;
            }

            using (var regKey = newKey)
            {
                ApplyValueDiffs(regKey, toAdd: newRes.Entries);
            }

            return(new ApplyResourceChangeResult <RegistryKeyResource>
            {
                NewState = input.PlannedState,
                Private = StateHelper.Serialize(pState),
            });
        }
        private ApplyResourceChangeResult <RegistryKeyResource> DoDelete(
            ApplyResourceChangeInput <RegistryKeyResource> input)
        {
            var oldRes = input.PriorState;
            var pState = StateHelper.Deserialize <PrivateState>(input.PlannedPrivate);

            _log.LogInformation($"Deleting registry key at [{oldRes.Root}][{oldRes.Path}]");
            RegistryKey root   = RegUtil.ParseRootKey(oldRes.Root);
            RegistryKey oldKey = root.OpenSubKey(oldRes.Path, true);

            if (oldKey != null)
            {
                string delKey = null;
                using (var regKey = oldKey)
                {
                    ApplyValueDiffs(regKey, toDel: oldRes.Entries);

                    var subKeysLen = oldKey.GetSubKeyNames()?.Length ?? 0;
                    var valuesLen  = oldKey.GetValueNames()?.Length ?? 0;
                    var forceDel   = oldRes.ForceOnDelete ?? false;

                    if (!(pState?.RegistryKeyCreated ?? false))
                    {
                        _log.LogWarning("registry key was not created by us");
                    }
                    if (subKeysLen > 0)
                    {
                        _log.LogWarning($"registry key still has [{subKeysLen}] subkey(s)");
                    }
                    if (valuesLen > 0)
                    {
                        _log.LogWarning($"registry key still has [{valuesLen}] value(s)");
                    }

                    if (!(pState?.RegistryKeyCreated ?? false) || subKeysLen > 0 || valuesLen > 0)
                    {
                        if (forceDel)
                        {
                            _log.LogWarning("forced delete specified");
                            delKey = oldKey.Name;
                        }
                        else
                        {
                            _log.LogWarning("reg key was not created by us or is not empty, SKIPPING delete");
                        }
                    }
                    else
                    {
                        delKey = oldKey.Name;
                    }
                }

                if (delKey != null)
                {
                    var openParent = RegUtil.OpenParentWithName(delKey, true);
                    if (openParent == null)
                    {
                        _log.LogWarning($"Cannot delete Registry Key [{delKey}], malformed path");
                    }
                    else
                    {
                        var(delRoot, parent, name) = openParent.Value;
                        _log.LogInformation($"Deleting Registry Key [{name}] under [{(parent??delRoot).Name}] ({delRoot.Name})");
                        using (var regKey = parent)
                        {
                            regKey.DeleteSubKeyTree(name, false);
                        }
                    }
                }
            }
            else
            {
                _log.LogInformation("Could not open existing, prior reg key, skipping");
            }

            return(new ApplyResourceChangeResult <RegistryKeyResource>
            {
                NewState = input.PlannedState,
                Private = null,
            });
        }