2018-09-22 11:44:42 +00:00
|
|
|
|
using Microsoft.Win32;
|
|
|
|
|
using Quasar.Common.Messages;
|
|
|
|
|
using Quasar.Common.Models;
|
2018-09-19 18:34:31 +00:00
|
|
|
|
using Quasar.Common.Networking;
|
2018-10-04 19:49:24 +00:00
|
|
|
|
using Quasar.Server.Networking;
|
2016-01-21 15:31:51 +00:00
|
|
|
|
|
2018-10-04 19:49:24 +00:00
|
|
|
|
namespace Quasar.Server.Messages
|
2016-01-21 15:31:51 +00:00
|
|
|
|
{
|
2018-09-19 18:34:31 +00:00
|
|
|
|
public class RegistryHandler : MessageProcessorBase<string>
|
2016-01-21 15:31:51 +00:00
|
|
|
|
{
|
2018-09-22 11:44:42 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// The client which is associated with this registry handler.
|
|
|
|
|
/// </summary>
|
2018-09-19 18:34:31 +00:00
|
|
|
|
private readonly Client _client;
|
2016-03-15 08:52:30 +00:00
|
|
|
|
|
2018-09-22 11:44:42 +00:00
|
|
|
|
public delegate void KeysReceivedEventHandler(object sender, string rootKey, RegSeekerMatch[] matches);
|
|
|
|
|
public delegate void KeyCreatedEventHandler(object sender, string parentPath, RegSeekerMatch match);
|
|
|
|
|
public delegate void KeyDeletedEventHandler(object sender, string parentPath, string subKey);
|
|
|
|
|
public delegate void KeyRenamedEventHandler(object sender, string parentPath, string oldSubKey, string newSubKey);
|
|
|
|
|
public delegate void ValueCreatedEventHandler(object sender, string keyPath, RegValueData value);
|
|
|
|
|
public delegate void ValueDeletedEventHandler(object sender, string keyPath, string valueName);
|
|
|
|
|
public delegate void ValueRenamedEventHandler(object sender, string keyPath, string oldValueName, string newValueName);
|
|
|
|
|
public delegate void ValueChangedEventHandler(object sender, string keyPath, RegValueData value);
|
|
|
|
|
|
|
|
|
|
public event KeysReceivedEventHandler KeysReceived;
|
|
|
|
|
public event KeyCreatedEventHandler KeyCreated;
|
|
|
|
|
public event KeyDeletedEventHandler KeyDeleted;
|
|
|
|
|
public event KeyRenamedEventHandler KeyRenamed;
|
|
|
|
|
public event ValueCreatedEventHandler ValueCreated;
|
|
|
|
|
public event ValueDeletedEventHandler ValueDeleted;
|
|
|
|
|
public event ValueRenamedEventHandler ValueRenamed;
|
|
|
|
|
public event ValueChangedEventHandler ValueChanged;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Reports initially received registry keys.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="rootKey">The root registry key name.</param>
|
|
|
|
|
/// <param name="matches">The child registry keys.</param>
|
|
|
|
|
private void OnKeysReceived(string rootKey, RegSeekerMatch[] matches)
|
|
|
|
|
{
|
|
|
|
|
SynchronizationContext.Post(t =>
|
|
|
|
|
{
|
|
|
|
|
var handler = KeysReceived;
|
|
|
|
|
handler?.Invoke(this, rootKey, (RegSeekerMatch[]) t);
|
|
|
|
|
}, matches);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Reports created registry keys.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="parentPath">The registry key parent path.</param>
|
|
|
|
|
/// <param name="match">The created registry key.</param>
|
|
|
|
|
private void OnKeyCreated(string parentPath, RegSeekerMatch match)
|
|
|
|
|
{
|
|
|
|
|
SynchronizationContext.Post(t =>
|
|
|
|
|
{
|
|
|
|
|
var handler = KeyCreated;
|
|
|
|
|
handler?.Invoke(this, parentPath, (RegSeekerMatch) t);
|
|
|
|
|
}, match);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Reports deleted registry keys.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="parentPath">The registry key parent path.</param>
|
|
|
|
|
/// <param name="subKey">The registry sub key name.</param>
|
|
|
|
|
private void OnKeyDeleted(string parentPath, string subKey)
|
|
|
|
|
{
|
|
|
|
|
SynchronizationContext.Post(t =>
|
|
|
|
|
{
|
|
|
|
|
var handler = KeyDeleted;
|
|
|
|
|
handler?.Invoke(this, parentPath, (string) t);
|
|
|
|
|
}, subKey);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Reports renamed registry keys.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="parentPath">The registry key parent path.</param>
|
|
|
|
|
/// <param name="oldSubKey">The old registry sub key name.</param>
|
|
|
|
|
/// <param name="newSubKey">The new registry sub key name.</param>
|
|
|
|
|
private void OnKeyRenamed(string parentPath, string oldSubKey, string newSubKey)
|
|
|
|
|
{
|
|
|
|
|
SynchronizationContext.Post(t =>
|
|
|
|
|
{
|
|
|
|
|
var handler = KeyRenamed;
|
|
|
|
|
handler?.Invoke(this, parentPath, oldSubKey, (string) t);
|
|
|
|
|
}, newSubKey);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Reports created registry values.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="keyPath">The registry key path.</param>
|
|
|
|
|
/// <param name="value">The created value.</param>
|
|
|
|
|
private void OnValueCreated(string keyPath, RegValueData value)
|
|
|
|
|
{
|
|
|
|
|
SynchronizationContext.Post(t =>
|
|
|
|
|
{
|
|
|
|
|
var handler = ValueCreated;
|
|
|
|
|
handler?.Invoke(this, keyPath, (RegValueData)t);
|
|
|
|
|
}, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Reports deleted registry values.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="keyPath">The registry key path.</param>
|
|
|
|
|
/// <param name="valueName">The value name.</param>
|
|
|
|
|
private void OnValueDeleted(string keyPath, string valueName)
|
|
|
|
|
{
|
|
|
|
|
SynchronizationContext.Post(t =>
|
|
|
|
|
{
|
|
|
|
|
var handler = ValueDeleted;
|
|
|
|
|
handler?.Invoke(this, keyPath, (string) t);
|
|
|
|
|
}, valueName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Reports renamed registry values.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="keyPath">The registry key path.</param>
|
|
|
|
|
/// <param name="oldValueName">The old value name.</param>
|
|
|
|
|
/// <param name="newValueName">The new value name.</param>
|
|
|
|
|
private void OnValueRenamed(string keyPath, string oldValueName, string newValueName)
|
|
|
|
|
{
|
|
|
|
|
SynchronizationContext.Post(t =>
|
|
|
|
|
{
|
|
|
|
|
var handler = ValueRenamed;
|
|
|
|
|
handler?.Invoke(this, keyPath, oldValueName, (string) t);
|
|
|
|
|
}, newValueName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Reports changed registry values.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="keyPath">The registry key path.</param>
|
|
|
|
|
/// <param name="value">The new value.</param>
|
|
|
|
|
private void OnValueChanged(string keyPath, RegValueData value)
|
|
|
|
|
{
|
|
|
|
|
SynchronizationContext.Post(t =>
|
|
|
|
|
{
|
|
|
|
|
var handler = ValueChanged;
|
|
|
|
|
handler?.Invoke(this, keyPath, (RegValueData) t);
|
|
|
|
|
}, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Initializes a new instance of the <see cref="RegistryHandler"/> class using the given client.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="client">The associated client.</param>
|
2018-09-19 18:34:31 +00:00
|
|
|
|
public RegistryHandler(Client client) : base(true)
|
2016-01-21 15:31:51 +00:00
|
|
|
|
{
|
2018-09-19 18:34:31 +00:00
|
|
|
|
_client = client;
|
2016-01-21 15:31:51 +00:00
|
|
|
|
}
|
2016-01-21 17:58:52 +00:00
|
|
|
|
|
2018-09-19 18:34:31 +00:00
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public override bool CanExecute(IMessage message) => message is GetRegistryKeysResponse ||
|
|
|
|
|
message is GetCreateRegistryKeyResponse ||
|
|
|
|
|
message is GetDeleteRegistryKeyResponse ||
|
|
|
|
|
message is GetRenameRegistryKeyResponse ||
|
|
|
|
|
message is GetCreateRegistryValueResponse ||
|
|
|
|
|
message is GetDeleteRegistryValueResponse ||
|
|
|
|
|
message is GetRenameRegistryValueResponse ||
|
|
|
|
|
message is GetChangeRegistryValueResponse;
|
2016-01-21 17:58:52 +00:00
|
|
|
|
|
2018-09-19 18:34:31 +00:00
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender);
|
2016-01-21 17:58:52 +00:00
|
|
|
|
|
2018-09-19 18:34:31 +00:00
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public override void Execute(ISender sender, IMessage message)
|
2016-01-21 17:58:52 +00:00
|
|
|
|
{
|
2018-09-19 18:34:31 +00:00
|
|
|
|
switch (message)
|
2016-01-21 17:58:52 +00:00
|
|
|
|
{
|
2018-09-19 18:34:31 +00:00
|
|
|
|
case GetRegistryKeysResponse keysResp:
|
|
|
|
|
Execute(sender, keysResp);
|
|
|
|
|
break;
|
|
|
|
|
case GetCreateRegistryKeyResponse createKeysResp:
|
|
|
|
|
Execute(sender, createKeysResp);
|
|
|
|
|
break;
|
|
|
|
|
case GetDeleteRegistryKeyResponse deleteKeysResp:
|
|
|
|
|
Execute(sender, deleteKeysResp);
|
|
|
|
|
break;
|
|
|
|
|
case GetRenameRegistryKeyResponse renameKeysResp:
|
|
|
|
|
Execute(sender, renameKeysResp);
|
|
|
|
|
break;
|
|
|
|
|
case GetCreateRegistryValueResponse createValueResp:
|
|
|
|
|
Execute(sender, createValueResp);
|
|
|
|
|
break;
|
|
|
|
|
case GetDeleteRegistryValueResponse deleteValueResp:
|
|
|
|
|
Execute(sender, deleteValueResp);
|
|
|
|
|
break;
|
|
|
|
|
case GetRenameRegistryValueResponse renameValueResp:
|
|
|
|
|
Execute(sender, renameValueResp);
|
|
|
|
|
break;
|
|
|
|
|
case GetChangeRegistryValueResponse changeValueResp:
|
|
|
|
|
Execute(sender, changeValueResp);
|
|
|
|
|
break;
|
2016-01-21 17:58:52 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2016-01-22 15:00:13 +00:00
|
|
|
|
|
2018-09-22 11:44:42 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Loads the registry keys of a given root key.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="rootKeyName">The root key name.</param>
|
|
|
|
|
public void LoadRegistryKey(string rootKeyName)
|
|
|
|
|
{
|
|
|
|
|
_client.Send(new DoLoadRegistryKey
|
|
|
|
|
{
|
|
|
|
|
RootKeyName = rootKeyName
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Creates a registry key at the given parent path.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="parentPath">The parent path.</param>
|
|
|
|
|
public void CreateRegistryKey(string parentPath)
|
|
|
|
|
{
|
|
|
|
|
_client.Send(new DoCreateRegistryKey
|
|
|
|
|
{
|
|
|
|
|
ParentPath = parentPath
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Deletes the given registry key.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="parentPath">The parent path of the registry key to delete.</param>
|
|
|
|
|
/// <param name="keyName">The registry key name to delete.</param>
|
|
|
|
|
public void DeleteRegistryKey(string parentPath, string keyName)
|
|
|
|
|
{
|
|
|
|
|
_client.Send(new DoDeleteRegistryKey
|
|
|
|
|
{
|
|
|
|
|
ParentPath = parentPath,
|
|
|
|
|
KeyName = keyName
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Renames the given registry key.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="parentPath">The parent path of the registry key to rename.</param>
|
|
|
|
|
/// <param name="oldKeyName">The old name of the registry key.</param>
|
|
|
|
|
/// <param name="newKeyName">The new name of the registry key.</param>
|
|
|
|
|
public void RenameRegistryKey(string parentPath, string oldKeyName, string newKeyName)
|
|
|
|
|
{
|
|
|
|
|
_client.Send(new DoRenameRegistryKey
|
|
|
|
|
{
|
|
|
|
|
ParentPath = parentPath,
|
|
|
|
|
OldKeyName = oldKeyName,
|
|
|
|
|
NewKeyName = newKeyName
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Creates a registry key value.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="keyPath">The registry key path.</param>
|
|
|
|
|
/// <param name="kind">The kind of registry key value.</param>
|
|
|
|
|
public void CreateRegistryValue(string keyPath, RegistryValueKind kind)
|
|
|
|
|
{
|
|
|
|
|
_client.Send(new DoCreateRegistryValue
|
|
|
|
|
{
|
|
|
|
|
KeyPath = keyPath,
|
|
|
|
|
Kind = kind
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Deletes the registry key value.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="keyPath">The registry key path.</param>
|
|
|
|
|
/// <param name="valueName">The registry key value name to delete.</param>
|
|
|
|
|
public void DeleteRegistryValue(string keyPath, string valueName)
|
|
|
|
|
{
|
|
|
|
|
_client.Send(new DoDeleteRegistryValue
|
|
|
|
|
{
|
|
|
|
|
KeyPath = keyPath,
|
|
|
|
|
ValueName = valueName
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Renames the registry key value.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="keyPath">The registry key path.</param>
|
|
|
|
|
/// <param name="oldValueName">The old registry key value name.</param>
|
|
|
|
|
/// <param name="newValueName">The new registry key value name.</param>
|
|
|
|
|
public void RenameRegistryValue(string keyPath, string oldValueName, string newValueName)
|
|
|
|
|
{
|
|
|
|
|
_client.Send(new DoRenameRegistryValue
|
|
|
|
|
{
|
|
|
|
|
KeyPath = keyPath,
|
|
|
|
|
OldValueName = oldValueName,
|
|
|
|
|
NewValueName = newValueName
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Changes the registry key value.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="keyPath">The registry key path.</param>
|
|
|
|
|
/// <param name="value">The updated registry key value.</param>
|
|
|
|
|
public void ChangeRegistryValue(string keyPath, RegValueData value)
|
|
|
|
|
{
|
|
|
|
|
_client.Send(new DoChangeRegistryValue
|
|
|
|
|
{
|
|
|
|
|
KeyPath = keyPath,
|
|
|
|
|
Value = value
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2018-09-19 18:34:31 +00:00
|
|
|
|
private void Execute(ISender client, GetRegistryKeysResponse message)
|
2016-01-22 15:00:13 +00:00
|
|
|
|
{
|
2018-09-22 11:44:42 +00:00
|
|
|
|
if (!message.IsError)
|
|
|
|
|
{
|
|
|
|
|
OnKeysReceived(message.RootKey, message.Matches);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
OnReport(message.ErrorMsg);
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-01-22 15:00:13 +00:00
|
|
|
|
|
2018-09-22 11:44:42 +00:00
|
|
|
|
private void Execute(ISender client, GetCreateRegistryKeyResponse message)
|
|
|
|
|
{
|
|
|
|
|
if (!message.IsError)
|
|
|
|
|
{
|
|
|
|
|
OnKeyCreated(message.ParentPath, message.Match);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
OnReport(message.ErrorMsg);
|
|
|
|
|
}
|
2016-01-25 10:57:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-09-22 11:44:42 +00:00
|
|
|
|
private void Execute(ISender client, GetDeleteRegistryKeyResponse message)
|
|
|
|
|
{
|
|
|
|
|
if (!message.IsError)
|
|
|
|
|
{
|
|
|
|
|
OnKeyDeleted(message.ParentPath, message.KeyName);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
OnReport(message.ErrorMsg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Execute(ISender client, GetRenameRegistryKeyResponse message)
|
|
|
|
|
{
|
|
|
|
|
if (!message.IsError)
|
|
|
|
|
{
|
|
|
|
|
OnKeyRenamed(message.ParentPath, message.OldKeyName, message.NewKeyName);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
OnReport(message.ErrorMsg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Execute(ISender client, GetCreateRegistryValueResponse message)
|
2016-01-25 17:21:07 +00:00
|
|
|
|
{
|
2018-09-22 11:44:42 +00:00
|
|
|
|
if (!message.IsError)
|
|
|
|
|
{
|
|
|
|
|
OnValueCreated(message.KeyPath, message.Value);
|
|
|
|
|
}
|
|
|
|
|
else
|
2016-01-25 17:21:07 +00:00
|
|
|
|
{
|
2018-09-22 11:44:42 +00:00
|
|
|
|
OnReport(message.ErrorMsg);
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-01-25 17:21:07 +00:00
|
|
|
|
|
2018-09-22 11:44:42 +00:00
|
|
|
|
private void Execute(ISender client, GetDeleteRegistryValueResponse message)
|
|
|
|
|
{
|
|
|
|
|
if (!message.IsError)
|
|
|
|
|
{
|
|
|
|
|
OnValueDeleted(message.KeyPath, message.ValueName);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
OnReport(message.ErrorMsg);
|
2016-01-27 08:54:01 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2018-09-22 11:44:42 +00:00
|
|
|
|
|
|
|
|
|
private void Execute(ISender client, GetRenameRegistryValueResponse message)
|
|
|
|
|
{
|
|
|
|
|
if (!message.IsError)
|
|
|
|
|
{
|
|
|
|
|
OnValueRenamed(message.KeyPath, message.OldValueName, message.NewValueName);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
OnReport(message.ErrorMsg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Execute(ISender client, GetChangeRegistryValueResponse message)
|
|
|
|
|
{
|
|
|
|
|
if (!message.IsError)
|
|
|
|
|
{
|
|
|
|
|
OnValueChanged(message.KeyPath, message.Value);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
OnReport(message.ErrorMsg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void Dispose(bool disposing)
|
|
|
|
|
{
|
|
|
|
|
}
|
2016-01-21 15:31:51 +00:00
|
|
|
|
}
|
|
|
|
|
}
|