266 lines
7.7 KiB
C#
266 lines
7.7 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Runtime.InteropServices;
|
|
using Decal.Adapter.Support;
|
|
using Decal.Interop.Core;
|
|
using Decal.Interop.Net;
|
|
using Microsoft.Win32;
|
|
|
|
namespace Decal.Adapter;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
[ComVisible(true)]
|
|
[ClassInterface(ClassInterfaceType.None)]
|
|
[ComDefaultInterface(typeof(IAdapterSurrogate))]
|
|
[ProgId("DecalAdapter.Surrogate")]
|
|
[Guid("71A69713-6593-47EC-0002-0000000DECA1")]
|
|
public sealed class Surrogate : MarshalByRefObject, IAdapterSurrogate, IDecalFileSurrogate
|
|
{
|
|
private string myAssemblyName;
|
|
|
|
private string myPath;
|
|
|
|
private string myTypeName;
|
|
|
|
string IAdapterSurrogate.Version
|
|
{
|
|
get
|
|
{
|
|
CoreManager current = CoreManager.Current;
|
|
if (current == null)
|
|
{
|
|
current = CoreManager.Current;
|
|
}
|
|
if (File.Exists(Path.Combine(myPath, myAssemblyName)))
|
|
{
|
|
return FileVersionInfo.GetVersionInfo(Path.Combine(myPath, myAssemblyName)).FileVersion;
|
|
}
|
|
return "";
|
|
}
|
|
}
|
|
|
|
bool IAdapterSurrogate.FileExists => File.Exists(Path.Combine(myPath, myAssemblyName));
|
|
|
|
string IAdapterSurrogate.FilePath => Path.Combine(myPath, myAssemblyName);
|
|
|
|
string IDecalFileSurrogate.Description => "Decal.Adapter Extension";
|
|
|
|
string IDecalFileSurrogate.Extension => "dll";
|
|
|
|
IntPtr IAdapterSurrogate.CreateInstance(DecalEnum pInitData, ref Guid riid)
|
|
{
|
|
if (CoreManager.ServiceRunning)
|
|
{
|
|
CoreManager current = CoreManager.Current;
|
|
try
|
|
{
|
|
myTypeName = (string)((IDecalEnum)pInitData).get_Property("Object");
|
|
myAssemblyName = (string)((IDecalEnum)pInitData).get_Property("Assembly");
|
|
myPath = (string)((IDecalEnum)pInitData).get_Property("Path");
|
|
Assembly assembly = ((!(pInitData.Group == "Plugins")) ? current.Assembly(myAssemblyName, myPath) : current.Assembly(myAssemblyName, myPath, current.PluginDomain));
|
|
Type type = assembly.GetType(myTypeName);
|
|
if (null == type)
|
|
{
|
|
throw new COMHResultException(HResults.E_FAIL);
|
|
}
|
|
IntPtr ppv;
|
|
if (type.IsSubclassOf(typeof(Extension)))
|
|
{
|
|
Extension extension = ((!type.IsSubclassOf(typeof(PluginBase))) ? ((Extension)Activator.CreateInstance(type, null)) : ((Extension)current.PluginDomain.CreateInstanceFromAndUnwrap(Path.Combine(myPath, myAssemblyName), myTypeName)));
|
|
extension.Path = myPath;
|
|
object obj = null;
|
|
switch (extension.ExtensionType)
|
|
{
|
|
case DecalExtensionType.Service:
|
|
if (extension is ServiceBase serviceBase)
|
|
{
|
|
current.AddService(serviceBase);
|
|
obj = new ServiceProxy(serviceBase);
|
|
}
|
|
break;
|
|
case DecalExtensionType.NetworkFilter:
|
|
if (extension is FilterBase filterBase)
|
|
{
|
|
current.AddFilter(filterBase);
|
|
obj = new FilterProxy(filterBase);
|
|
}
|
|
break;
|
|
case DecalExtensionType.Plugin:
|
|
if (extension is PluginBase pluginBase)
|
|
{
|
|
current.AddPlugin(pluginBase);
|
|
obj = new PluginProxy(pluginBase);
|
|
}
|
|
break;
|
|
}
|
|
IntPtr pUnk = ((obj == null) ? Marshal.GetIUnknownForObject(extension) : Marshal.GetIUnknownForObject(obj));
|
|
int num = Marshal.QueryInterface(pUnk, ref riid, out ppv);
|
|
Marshal.Release(pUnk);
|
|
if (num < 0)
|
|
{
|
|
throw new Exception();
|
|
}
|
|
return ppv;
|
|
}
|
|
object o = Activator.CreateInstance(type, null);
|
|
if (!type.IsSubclassOf(typeof(INetworkFilter)))
|
|
{
|
|
type.IsSubclassOf(typeof(INetworkFilter2));
|
|
}
|
|
IntPtr iUnknownForObject = Marshal.GetIUnknownForObject(o);
|
|
Marshal.QueryInterface(iUnknownForObject, ref riid, out ppv);
|
|
Marshal.Release(iUnknownForObject);
|
|
return ppv;
|
|
}
|
|
catch
|
|
{
|
|
throw new COMHResultException(HResults.E_FAIL);
|
|
}
|
|
finally
|
|
{
|
|
Marshal.ReleaseComObject(pInitData);
|
|
}
|
|
}
|
|
Marshal.ReleaseComObject(pInitData);
|
|
throw new COMHResultException(HResults.E_FAIL);
|
|
}
|
|
|
|
void IAdapterSurrogate.SetEnum(DecalEnum pInitData)
|
|
{
|
|
try
|
|
{
|
|
myTypeName = (string)((IDecalEnum)pInitData).get_Property("Object");
|
|
myAssemblyName = (string)((IDecalEnum)pInitData).get_Property("Assembly");
|
|
myPath = (string)((IDecalEnum)pInitData).get_Property("Path");
|
|
Marshal.ReleaseComObject(pInitData);
|
|
}
|
|
catch (COMException)
|
|
{
|
|
}
|
|
}
|
|
|
|
void IDecalFileSurrogate.Register(string Filename)
|
|
{
|
|
bool flag = false;
|
|
int num = 0;
|
|
int num2 = 0;
|
|
try
|
|
{
|
|
if (File.Exists(Filename))
|
|
{
|
|
Assembly assembly = Assembly.LoadFile(Filename);
|
|
string text = "";
|
|
if (Attribute.IsDefined(assembly, typeof(GuidAttribute)))
|
|
{
|
|
text = ((GuidAttribute)Attribute.GetCustomAttribute(assembly, typeof(GuidAttribute))).Value.ToUpper(CultureInfo.InvariantCulture);
|
|
}
|
|
Type[] types;
|
|
try
|
|
{
|
|
types = assembly.GetTypes();
|
|
}
|
|
catch (ReflectionTypeLoadException ex)
|
|
{
|
|
types = ex.Types;
|
|
}
|
|
Type[] array = types;
|
|
foreach (Type type in array)
|
|
{
|
|
if (null == type || !type.IsPublic)
|
|
{
|
|
continue;
|
|
}
|
|
int num3 = 0;
|
|
if (!type.IsSubclassOf(typeof(Extension)))
|
|
{
|
|
continue;
|
|
}
|
|
string directoryName = Path.GetDirectoryName(Filename);
|
|
string fileName = Path.GetFileName(Filename);
|
|
string value = "";
|
|
string value2 = "{71A69713-6593-47EC-0002-0000000DECA1}";
|
|
string text2 = "";
|
|
if (type.IsSubclassOf(typeof(PluginBase)))
|
|
{
|
|
text2 = "Plugins";
|
|
num++;
|
|
num3 = num;
|
|
}
|
|
else
|
|
{
|
|
if (!type.IsSubclassOf(typeof(FilterBase)))
|
|
{
|
|
continue;
|
|
}
|
|
text2 = "NetworkFilters";
|
|
num2++;
|
|
num3 = num2;
|
|
}
|
|
if (Attribute.IsDefined(type, typeof(FriendlyNameAttribute)))
|
|
{
|
|
value = ((FriendlyNameAttribute)Attribute.GetCustomAttribute(type, typeof(FriendlyNameAttribute))).Name;
|
|
}
|
|
string text3 = type.Namespace.ToString() + "." + type.Name.ToString();
|
|
string text4 = "";
|
|
if (Attribute.IsDefined(type, typeof(GuidAttribute)))
|
|
{
|
|
text4 = ((GuidAttribute)Attribute.GetCustomAttribute(type, typeof(GuidAttribute))).Value.ToString();
|
|
}
|
|
else if (!string.IsNullOrEmpty(text) && num3 == 1)
|
|
{
|
|
text4 = text;
|
|
}
|
|
else if (!string.IsNullOrEmpty(text))
|
|
{
|
|
byte[] array2 = new Guid(text).ToByteArray();
|
|
array2[15] = (byte)(array2[15] ^ num3);
|
|
text4 = new Guid(array2).ToString();
|
|
}
|
|
else
|
|
{
|
|
text4 = Guid.NewGuid().ToString();
|
|
}
|
|
text4 = text4.ToUpper(CultureInfo.InvariantCulture);
|
|
string subkey = string.Format("SOFTWARE\\Decal\\{0}\\{1}", text2, "{" + text4 + "}");
|
|
Util.WriteLine("Registering Decal.Adapter extension (Type:" + type.ToString() + ")");
|
|
Util.WriteLine("Assembly Directory: " + directoryName);
|
|
Util.WriteLine("Assembly File: " + fileName);
|
|
Util.WriteLine("Assembly Object: " + text3);
|
|
Util.WriteLine("Extension Registry CLSID: " + text4);
|
|
RegistryKey registryKey = Registry.LocalMachine.CreateSubKey(subkey);
|
|
if (registryKey != null)
|
|
{
|
|
registryKey.SetValue("Enabled", 0, RegistryValueKind.DWord);
|
|
registryKey.SetValue("Assembly", fileName, RegistryValueKind.String);
|
|
registryKey.SetValue("Path", directoryName, RegistryValueKind.String);
|
|
registryKey.SetValue("Object", text3, RegistryValueKind.String);
|
|
registryKey.SetValue("Surrogate", value2, RegistryValueKind.String);
|
|
if (!string.IsNullOrEmpty(value))
|
|
{
|
|
registryKey.SetValue("", value, RegistryValueKind.String);
|
|
}
|
|
else
|
|
{
|
|
registryKey.SetValue("", text3, RegistryValueKind.String);
|
|
}
|
|
flag = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex2)
|
|
{
|
|
Util.WriteLine("Exception registering plugin: " + ex2.ToString());
|
|
throw new COMHResultException(HResults.E_FAIL);
|
|
}
|
|
if (!flag)
|
|
{
|
|
throw new COMHResultException(HResults.E_FAIL);
|
|
}
|
|
}
|
|
}
|