private void Do_CreateKey(RegistryEnumKeyInfo keyInfo, LACTreeNode node)
        {
            if (keyInfo != null)
            {
                RegistryAddSubKeyDlg addDlg = new RegistryAddSubKeyDlg(string.Empty, true, keyInfo);
                if (addDlg.ShowDialog(this) == DialogResult.OK)
                {
                    IntPtr phkResult = IntPtr.Zero;
                    int ret = RegistryInteropWrapper.ApiRegCreateKeyEx(plugin.handle.Handle, keyInfo.pKey, Marshal.StringToHGlobalUni(addDlg.KeyName), out phkResult);
                    if (ret == 0)
                    {
                        if (phkResult != IntPtr.Zero)
                            RegistryInteropWrapper.ApiRegCloseKey(plugin.handle.Handle, phkResult);

                        if (!keyInfo.sKeyname.Trim().Equals(Properties.Resources.HKEY_THIS_MACHINE))
							RegistryInteropWrapper.ApiRegCloseKey(plugin.handle.Handle, keyInfo.pKey);

                        node.IsModified = true;
                        node.sc.ShowControl(node);
                    }
                    else
                    {
                        container.ShowError(this, "Registry cannot create the key with the name specified.\n It is because of either the name exists or parent key info is wrong");
                    }
                }
            }
        }
        private void Do_RenameKey(object ObjInfo, LACTreeNode node)
        {
            if (ObjInfo is SubKeyInfo)
            {
                SubKeyInfo keyInfo = ObjInfo as SubKeyInfo;
                if (keyInfo != null)
                {
                    //Get the parent key to add the new key
                    RegistryKey parentKey = ((SubKeyInfo)(node.Parent as LACTreeNode).Tag).sSubKey;

                    RegistryAddSubKeyDlg renameDlg = new RegistryAddSubKeyDlg(keyInfo.sKey, true, parentKey);
                    if (renameDlg.ShowDialog(this) == DialogResult.OK)
                    {
                        if (!string.IsNullOrEmpty(renameDlg.KeyName))
                        {
                            // Create a key with the new Name
                            RegistryKey newKey = RegistryInteropWrapperWindows.Win32CreateSubKey(parentKey, renameDlg.KeyName);

                            // Move the old key values & subkeys to new key
                            Do_MoveSubKeys(keyInfo.sSubKey, newKey);

                            // Delete oldKey
                            if (parentKey.SubKeyCount > 0)
                                RegistryInteropWrapperWindows.Win32DeleteSubKeyTree(parentKey, keyInfo.sKey);
                            else
                                RegistryInteropWrapperWindows.Win32DeleteSubKey(parentKey, keyInfo.sKey);
                        }
                    }
                }
            }
            else if (ObjInfo != null && ObjInfo is RegistryEnumKeyInfo)
            {
                RegistryEnumKeyInfo keyInfo = ObjInfo as RegistryEnumKeyInfo;

                RegistryAddSubKeyDlg renameDlg = new RegistryAddSubKeyDlg(keyInfo.sKeyname, true, keyInfo.pKey);
                if (renameDlg.ShowDialog(this) == DialogResult.OK)
                {
                    if (!string.IsNullOrEmpty(renameDlg.KeyName))
                    {
						//get the parent key handle
						RegistryEnumKeyInfo parentKeyinfo = node.Parent.Tag as RegistryEnumKeyInfo;
						if(parentKeyinfo != null)
						{
                            if (!parentKeyinfo.sKeyname.Trim().Equals(Properties.Resources.HKEY_THIS_MACHINE))
							{
								RegistryInteropWrapper.ApiRegOpenKeyExW(plugin.handle.Handle,
								                                        plugin.pRootHandle,
								                                        parentKeyinfo.sKeyname,
								                                        out keyInfo.pRootKey);
							}
							else
							{
								keyInfo.pRootKey = plugin.pRootHandle;
							}
						}

						renameDlg.KeyName = renameDlg.KeyName.LastIndexOf(@"\") < 0 ? renameDlg.KeyName : renameDlg.KeyName.Substring(renameDlg.KeyName.LastIndexOf(@"\")+1);

                        // Create a key with the new Name
                        IntPtr phkResult = IntPtr.Zero;
                        RegistryInteropWrapper.ApiRegCreateKeyEx(plugin.handle.Handle, keyInfo.pRootKey, Marshal.StringToHGlobalUni(renameDlg.KeyName), out phkResult);

                        // Move the old key values & subkeys to new key
                        Do_MoveSubKeys(keyInfo, phkResult);

                        if (phkResult != IntPtr.Zero)
                            RegistryInteropWrapper.ApiRegCloseKey(plugin.handle.Handle, phkResult);

						keyInfo.sKeyname = keyInfo.sKeyname.LastIndexOf(@"\") < 0 ? keyInfo.sKeyname : keyInfo.sKeyname.Substring(keyInfo.sKeyname.LastIndexOf(@"\")+1);

                        // Delete oldKey
                        if (keyInfo.sSubKeyCount > 0) {
                            RegistryInteropWrapper.ApiRegDeleteTree(plugin.handle.Handle, keyInfo.pRootKey, keyInfo.pKey, keyInfo.sKeyname);
                        }
                        else
                            RegistryInteropWrapper.ApiRegDeleteKey(plugin.handle.Handle, keyInfo.pRootKey, keyInfo.pKey, keyInfo.sKeyname);

                        if (!parentKeyinfo.sKeyname.Trim().Equals(Properties.Resources.HKEY_THIS_MACHINE))
				RegistryInteropWrapper.ApiRegCloseKey(plugin.handle.Handle, keyInfo.pRootKey);
					}
                }
            }

            LACTreeNode parentnode = node.Parent as LACTreeNode;
            parentnode.IsModified = true;
            parentnode.sc.ShowControl(parentnode);
        }
        private void Do_CreateKey(SubKeyInfo keyInfo, LACTreeNode node)
        {
            if (keyInfo != null)
            {
                RegistryAddSubKeyDlg addDlg = new RegistryAddSubKeyDlg(string.Empty, true, keyInfo.sSubKey);
                if (addDlg.ShowDialog(this) == DialogResult.OK)
                {
                    RegistryInteropWrapperWindows.Win32CreateSubKey(keyInfo.sSubKey, addDlg.KeyName);

                    treeNode.IsModified = true;
                    treeNode.sc.ShowControl(treeNode);
                }
            }
        }
        private void Do_RenameKeyValue(object ValueInfo, LACTreeNode node)
        {
            try
            {
                if (ValueInfo != null && ValueInfo is SubKeyValueInfo)
                {
                    SubKeyValueInfo valueInfo = ValueInfo as SubKeyValueInfo;
                    RegistryAddSubKeyDlg renameDlg = new RegistryAddSubKeyDlg(valueInfo.sValue, false, valueInfo.sParentKey);
                    if (renameDlg.ShowDialog(this) == DialogResult.OK)
                    {
                        if (!string.IsNullOrEmpty(renameDlg.KeyName))
                        {
                            RegistryInteropWrapperWindows.Win32RegKeyValueData(valueInfo.sParentKey, valueInfo.sValue, out valueInfo.sDataBuf);
                            RegistryInteropWrapperWindows.Win32DeleteSubKeyValue(valueInfo.sParentKey, valueInfo.sValue);
                            valueInfo.sValue = renameDlg.KeyName;
                            RegistryInteropWrapperWindows.Win32ModifySubKeyValue(valueInfo);
                        }
                    }
                }
                else
                {
                    RegistryValueInfo regValueInfo = ValueInfo as RegistryValueInfo;

					try{

	                    RegistryAddSubKeyDlg renameDlg = new RegistryAddSubKeyDlg(regValueInfo.pValueName, false, regValueInfo.pParentKey);
	                    if (renameDlg.ShowDialog(this) == DialogResult.OK)
	                    {
	                        if (!string.IsNullOrEmpty(renameDlg.KeyName))
	                        {
	                            RegistryInteropWrapper.GetRegGetValueW(plugin.handle.Handle, regValueInfo);

	                            RegistryInteropWrapper.ApiRegDeleteValue(plugin.handle.Handle,
	                                            regValueInfo.pParentKey,
	                                            regValueInfo.pValueName);

	                            regValueInfo.pValueName = renameDlg.KeyName;
	                            RegistryInteropWrapper.ApiRegSetValueEx(plugin.handle.Handle,
	                                            regValueInfo.pParentKey,
	                                            regValueInfo.pValueName,
	                                            (uint)regValueInfo.pType,
	                                            regValueInfo.bDataBuf as byte[]);
	                        }
						}
					}catch{}

                    if (!regValueInfo.sKeyname.Trim().Equals(Properties.Resources.HKEY_THIS_MACHINE))
				RegistryInteropWrapper.ApiRegCloseKey(plugin.handle.Handle, regValueInfo.pParentKey);
                }

                treeNode.IsModified = true;
				treeNode.sc.ShowControl(treeNode);
            }
            catch (Exception ex)
            {
                Logger.LogException("Do_RenameKeyValue :", ex);
            }
        }