mirror of
				https://github.com/chibicitiberiu/rainmeter-studio.git
				synced 2024-02-24 04:33:31 +00:00 
			
		
		
		
	DllExporter: Move under Build\ directory
Also makes InputText use an architecture specific version of DllExporter.
This commit is contained in:
		@@ -1,7 +1,7 @@
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Runtime.CompilerServices;
 | 
			
		||||
using System.Runtime.InteropServices;
 | 
			
		||||
 | 
			
		||||
[assembly: AssemblyCopyright("© 2013 - Birunthan Mohanathas")]
 | 
			
		||||
[assembly: AssemblyVersion("1.0.1.0")]
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Runtime.CompilerServices;
 | 
			
		||||
using System.Runtime.InteropServices;
 | 
			
		||||
 | 
			
		||||
[assembly: AssemblyCopyright("© 2013 - Birunthan Mohanathas")]
 | 
			
		||||
[assembly: AssemblyVersion("1.0.1.0")]
 | 
			
		||||
[assembly: AssemblyProduct("Rainmeter")]
 | 
			
		||||
@@ -1,94 +1,82 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
 | 
			
		||||
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
 | 
			
		||||
    <ProductVersion>8.0.30703</ProductVersion>
 | 
			
		||||
    <SchemaVersion>2.0</SchemaVersion>
 | 
			
		||||
    <ProjectGuid>{49D56CA5-54AB-45C9-A245-EAE588FCBFE1}</ProjectGuid>
 | 
			
		||||
    <OutputType>Exe</OutputType>
 | 
			
		||||
    <AppDesignerFolder>Properties</AppDesignerFolder>
 | 
			
		||||
    <RootNamespace>DllExporter</RootNamespace>
 | 
			
		||||
    <AssemblyName>DllExporter</AssemblyName>
 | 
			
		||||
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
 | 
			
		||||
    <FileAlignment>512</FileAlignment>
 | 
			
		||||
    <PublishUrl>publish\</PublishUrl>
 | 
			
		||||
    <Install>true</Install>
 | 
			
		||||
    <InstallFrom>Disk</InstallFrom>
 | 
			
		||||
    <UpdateEnabled>false</UpdateEnabled>
 | 
			
		||||
    <UpdateMode>Foreground</UpdateMode>
 | 
			
		||||
    <UpdateInterval>7</UpdateInterval>
 | 
			
		||||
    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
 | 
			
		||||
    <UpdatePeriodically>false</UpdatePeriodically>
 | 
			
		||||
    <UpdateRequired>false</UpdateRequired>
 | 
			
		||||
    <MapFileExtensions>true</MapFileExtensions>
 | 
			
		||||
    <ApplicationRevision>0</ApplicationRevision>
 | 
			
		||||
    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
 | 
			
		||||
    <IsWebBootstrapper>false</IsWebBootstrapper>
 | 
			
		||||
    <UseApplicationTrust>false</UseApplicationTrust>
 | 
			
		||||
    <BootstrapperEnabled>true</BootstrapperEnabled>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
 | 
			
		||||
    <PlatformTarget>x86</PlatformTarget>
 | 
			
		||||
    <DebugSymbols>true</DebugSymbols>
 | 
			
		||||
    <DebugType>full</DebugType>
 | 
			
		||||
    <Optimize>false</Optimize>
 | 
			
		||||
    <OutputPath>bin\Debug\</OutputPath>
 | 
			
		||||
    <DefineConstants>DEBUG;TRACE</DefineConstants>
 | 
			
		||||
    <ErrorReport>prompt</ErrorReport>
 | 
			
		||||
    <WarningLevel>4</WarningLevel>
 | 
			
		||||
    <NoWarn>1607</NoWarn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
 | 
			
		||||
    <PlatformTarget>x86</PlatformTarget>
 | 
			
		||||
    <DebugType>none</DebugType>
 | 
			
		||||
    <Optimize>true</Optimize>
 | 
			
		||||
    <OutputPath>bin\Release\</OutputPath>
 | 
			
		||||
    <DefineConstants>TRACE</DefineConstants>
 | 
			
		||||
    <ErrorReport>prompt</ErrorReport>
 | 
			
		||||
    <WarningLevel>4</WarningLevel>
 | 
			
		||||
    <NoWarn>1607</NoWarn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
 | 
			
		||||
    <DebugSymbols>true</DebugSymbols>
 | 
			
		||||
    <OutputPath>bin\x64\Debug\</OutputPath>
 | 
			
		||||
    <DefineConstants>DEBUG;TRACE</DefineConstants>
 | 
			
		||||
    <DebugType>full</DebugType>
 | 
			
		||||
    <PlatformTarget>x64</PlatformTarget>
 | 
			
		||||
    <ErrorReport>prompt</ErrorReport>
 | 
			
		||||
    <NoWarn>1607</NoWarn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
 | 
			
		||||
    <OutputPath>bin\x64\Release\</OutputPath>
 | 
			
		||||
    <DefineConstants>TRACE</DefineConstants>
 | 
			
		||||
    <Optimize>true</Optimize>
 | 
			
		||||
    <DebugType>none</DebugType>
 | 
			
		||||
    <PlatformTarget>x64</PlatformTarget>
 | 
			
		||||
    <ErrorReport>prompt</ErrorReport>
 | 
			
		||||
    <NoWarn>1607</NoWarn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Reference Include="Microsoft.Build.Utilities.v4.0" />
 | 
			
		||||
    <Reference Include="System" />
 | 
			
		||||
    <Reference Include="System.Data" />
 | 
			
		||||
    <Reference Include="System.Xml" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Compile Include="Program.cs" />
 | 
			
		||||
    <Compile Include="AssemblyInfo.cs" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <PostBuildEvent>if not exist "$(SolutionDir)Plugins\API\DllExporter.exe" (move "$(TargetPath)" "$(SolutionDir)Plugins\API\DllExporter.exe")</PostBuildEvent>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
 | 
			
		||||
       Other similar extension points exist, see Microsoft.Common.targets.
 | 
			
		||||
  <Target Name="BeforeBuild">
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="AfterBuild">
 | 
			
		||||
  </Target>
 | 
			
		||||
  -->
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
 | 
			
		||||
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
 | 
			
		||||
    <ProductVersion>8.0.30703</ProductVersion>
 | 
			
		||||
    <SchemaVersion>2.0</SchemaVersion>
 | 
			
		||||
    <ProjectGuid>{49D56CA5-54AB-45C9-A245-EAE588FCBFE1}</ProjectGuid>
 | 
			
		||||
    <OutputType>Exe</OutputType>
 | 
			
		||||
    <AppDesignerFolder>Properties</AppDesignerFolder>
 | 
			
		||||
    <RootNamespace>DllExporter</RootNamespace>
 | 
			
		||||
    <AssemblyName>DllExporter</AssemblyName>
 | 
			
		||||
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
 | 
			
		||||
    <FileAlignment>512</FileAlignment>
 | 
			
		||||
    <PublishUrl>publish\</PublishUrl>
 | 
			
		||||
    <Install>true</Install>
 | 
			
		||||
    <InstallFrom>Disk</InstallFrom>
 | 
			
		||||
    <UpdateEnabled>false</UpdateEnabled>
 | 
			
		||||
    <UpdateMode>Foreground</UpdateMode>
 | 
			
		||||
    <UpdateInterval>7</UpdateInterval>
 | 
			
		||||
    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
 | 
			
		||||
    <UpdatePeriodically>false</UpdatePeriodically>
 | 
			
		||||
    <UpdateRequired>false</UpdateRequired>
 | 
			
		||||
    <MapFileExtensions>true</MapFileExtensions>
 | 
			
		||||
    <ApplicationRevision>0</ApplicationRevision>
 | 
			
		||||
    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
 | 
			
		||||
    <IsWebBootstrapper>false</IsWebBootstrapper>
 | 
			
		||||
    <UseApplicationTrust>false</UseApplicationTrust>
 | 
			
		||||
    <BootstrapperEnabled>true</BootstrapperEnabled>
 | 
			
		||||
    <OutputPath Condition=" '$(Platform)' == 'x86' ">$(SolutionDir)x32-$(Configuration)\Tools\</OutputPath>
 | 
			
		||||
    <OutputPath Condition=" '$(Platform)' == 'x64' ">$(SolutionDir)x64-$(Configuration)\Tools\</OutputPath>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
 | 
			
		||||
    <PlatformTarget>x86</PlatformTarget>
 | 
			
		||||
    <DebugSymbols>true</DebugSymbols>
 | 
			
		||||
    <DebugType>full</DebugType>
 | 
			
		||||
    <Optimize>false</Optimize>
 | 
			
		||||
    <DefineConstants>DEBUG;TRACE</DefineConstants>
 | 
			
		||||
    <ErrorReport>prompt</ErrorReport>
 | 
			
		||||
    <WarningLevel>4</WarningLevel>
 | 
			
		||||
    <NoWarn>1607</NoWarn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
 | 
			
		||||
    <PlatformTarget>x86</PlatformTarget>
 | 
			
		||||
    <DebugType>none</DebugType>
 | 
			
		||||
    <Optimize>true</Optimize>
 | 
			
		||||
    <DefineConstants>TRACE</DefineConstants>
 | 
			
		||||
    <ErrorReport>prompt</ErrorReport>
 | 
			
		||||
    <WarningLevel>4</WarningLevel>
 | 
			
		||||
    <NoWarn>1607</NoWarn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
 | 
			
		||||
    <DebugSymbols>true</DebugSymbols>
 | 
			
		||||
    <DefineConstants>DEBUG;TRACE</DefineConstants>
 | 
			
		||||
    <DebugType>full</DebugType>
 | 
			
		||||
    <PlatformTarget>x64</PlatformTarget>
 | 
			
		||||
    <ErrorReport>prompt</ErrorReport>
 | 
			
		||||
    <NoWarn>1607</NoWarn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
 | 
			
		||||
    <DefineConstants>TRACE</DefineConstants>
 | 
			
		||||
    <Optimize>true</Optimize>
 | 
			
		||||
    <DebugType>none</DebugType>
 | 
			
		||||
    <PlatformTarget>x64</PlatformTarget>
 | 
			
		||||
    <ErrorReport>prompt</ErrorReport>
 | 
			
		||||
    <NoWarn>1607</NoWarn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Reference Include="Microsoft.Build.Utilities.v4.0" />
 | 
			
		||||
    <Reference Include="System" />
 | 
			
		||||
    <Reference Include="System.Data" />
 | 
			
		||||
    <Reference Include="System.Xml" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Compile Include="Program.cs" />
 | 
			
		||||
    <Compile Include="AssemblyInfo.cs" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 | 
			
		||||
</Project>
 | 
			
		||||
@@ -1,233 +1,241 @@
 | 
			
		||||
/*
 | 
			
		||||
  Copyright (C) 2011 Birunthan Mohanathas
 | 
			
		||||
 | 
			
		||||
  This program is free software; you can redistribute it and/or
 | 
			
		||||
  modify it under the terms of the GNU General Public License
 | 
			
		||||
  as published by the Free Software Foundation; either version 2
 | 
			
		||||
  of the License, or (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
  This program is distributed in the hope that it will be useful,
 | 
			
		||||
  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
  GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
  You should have received a copy of the GNU General Public License
 | 
			
		||||
  along with this program; if not, write to the Free Software
 | 
			
		||||
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using Microsoft.Build.Utilities;
 | 
			
		||||
using System.IO;
 | 
			
		||||
 | 
			
		||||
namespace DllExporter
 | 
			
		||||
{
 | 
			
		||||
    class Program
 | 
			
		||||
    {
 | 
			
		||||
        static int Main(string[] args)
 | 
			
		||||
        {
 | 
			
		||||
            string configurationName = args[0];
 | 
			
		||||
            string platformTarget = args[1];
 | 
			
		||||
            string targetDirectory = args[2];
 | 
			
		||||
            string targetDllName = targetDirectory + args[3];
 | 
			
		||||
            string targetIlName = targetDllName + ".il";
 | 
			
		||||
            string targetResName = targetDllName + ".res";
 | 
			
		||||
 | 
			
		||||
            bool is64 = platformTarget.ToLower().Equals("x64");
 | 
			
		||||
            bool isDebug = configurationName.ToLower().Equals("debug");
 | 
			
		||||
 | 
			
		||||
            string ilasmPath = FindIlasmPath(is64);
 | 
			
		||||
            if (ilasmPath == null)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: ilasm.exe not found");
 | 
			
		||||
                return 1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            string ildasmPath = FindIldasmPath();
 | 
			
		||||
            if (ildasmPath == null)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: ildasm.exe not found");
 | 
			
		||||
                return 1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Directory.SetCurrentDirectory(targetDirectory);
 | 
			
		||||
 | 
			
		||||
            // Disassemble
 | 
			
		||||
            Process ildasmProc = new Process();
 | 
			
		||||
            string ildasmArgs = string.Format(
 | 
			
		||||
                "/nobar {0} /output=\"{1}\" \"{2}\"",
 | 
			
		||||
                isDebug ? "/linenum" : "",
 | 
			
		||||
                targetIlName,
 | 
			
		||||
                targetDllName);
 | 
			
		||||
 | 
			
		||||
            ildasmProc.StartInfo = new ProcessStartInfo(ildasmPath, ildasmArgs);
 | 
			
		||||
            ildasmProc.StartInfo.UseShellExecute = false;
 | 
			
		||||
            ildasmProc.StartInfo.CreateNoWindow = false;
 | 
			
		||||
            ildasmProc.StartInfo.RedirectStandardOutput = true;
 | 
			
		||||
            ildasmProc.Start();
 | 
			
		||||
            ildasmProc.WaitForExit();
 | 
			
		||||
 | 
			
		||||
            if (ildasmProc.ExitCode != 0)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: Unable to disassemble!");
 | 
			
		||||
                Console.WriteLine(ildasmProc.StandardOutput.ReadToEnd());
 | 
			
		||||
                return ildasmProc.ExitCode;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            bool hasResource = File.Exists(targetResName);
 | 
			
		||||
 | 
			
		||||
            // Read disassembly and find methods marked with DllExport attribute
 | 
			
		||||
            List<string> lines = new List<string>(File.ReadAllLines(targetIlName));
 | 
			
		||||
            int attributeIndex = 0;
 | 
			
		||||
            int exportCount = 0;
 | 
			
		||||
            while (true)
 | 
			
		||||
            {
 | 
			
		||||
                attributeIndex = lines.FindIndex(attributeIndex, new Predicate<string>(x => x.Contains(".custom instance void") && x.Contains("DllExport::.ctor()")));
 | 
			
		||||
                if (attributeIndex < 8) break;
 | 
			
		||||
 | 
			
		||||
                int methodIndex = lines.FindLastIndex(attributeIndex, attributeIndex, new Predicate<string>(x => x.Contains(".method")));
 | 
			
		||||
                if (methodIndex == -1)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine("DllExporter error: Unable to parse disassembly (.method not found)!");
 | 
			
		||||
                    return 1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                int functionIndex = lines.FindIndex(methodIndex, new Predicate<string>(x => x.Contains("(")));
 | 
			
		||||
                if (functionIndex == -1)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine("DllExporter error: Unable to parse disassembly (bracket not found)!");
 | 
			
		||||
                    return 1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                int bracketPos = lines[functionIndex].IndexOf('(');
 | 
			
		||||
                int functionNamePos = lines[functionIndex].LastIndexOf(' ', bracketPos);
 | 
			
		||||
                string functionName = lines[functionIndex].Substring(functionNamePos, bracketPos - functionNamePos);
 | 
			
		||||
 | 
			
		||||
                // Change calling convention to cdecl
 | 
			
		||||
                lines[functionIndex] = string.Format("{0} modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) {1}", lines[functionIndex].Substring(0, functionNamePos - 1), lines[functionIndex].Substring(functionNamePos));
 | 
			
		||||
 | 
			
		||||
                int attributeBeginPos = lines[attributeIndex].IndexOf('.');
 | 
			
		||||
                string spaces = new string(' ', attributeBeginPos);
 | 
			
		||||
 | 
			
		||||
                // Replace attribute with export
 | 
			
		||||
                ++exportCount;
 | 
			
		||||
                lines[attributeIndex] = string.Format("{0}.export [{1}] as {2}", spaces, exportCount, functionName);
 | 
			
		||||
 | 
			
		||||
                ++attributeIndex;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (exportCount == 0)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter warning: Nothing found to export.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Remove the DllExport class
 | 
			
		||||
            int classIndex = lines.FindIndex(new Predicate<string>(x => x.Contains(".class ") && x.EndsWith(".DllExport")));
 | 
			
		||||
            if (classIndex == -1)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: Unable to parse disassembly (DllExport class not found)!");
 | 
			
		||||
                return 1;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                int classEndIndex = lines.FindIndex(classIndex, new Predicate<string>(x => x.Contains("} // end of class") && x.EndsWith(".DllExport")));
 | 
			
		||||
                if (classEndIndex == -1)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine("DllExporter error: Unable to parse disassembly (DllExport class end not found)!");
 | 
			
		||||
                    return 1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                lines.RemoveRange(classIndex, classEndIndex - classIndex + 2);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Write everything back
 | 
			
		||||
            File.WriteAllLines(targetIlName, lines.ToArray());
 | 
			
		||||
 | 
			
		||||
            // Reassemble
 | 
			
		||||
            Process ilasmProc = new Process();
 | 
			
		||||
            string resource = hasResource ? string.Format("/resource=\"{0}\"", targetResName) : "";
 | 
			
		||||
            string ilasmArgs = string.Format("/nologo /quiet /dll {0} {1} /output=\"{2}\" {3} \"{4}\"", isDebug ? "/debug /pdb" : "/optimize", is64 ? "/x64 /PE64" : "", targetDllName, resource, targetIlName);
 | 
			
		||||
            ilasmProc.StartInfo = new ProcessStartInfo(ilasmPath, ilasmArgs);
 | 
			
		||||
            ilasmProc.StartInfo.UseShellExecute = false;
 | 
			
		||||
            ilasmProc.StartInfo.CreateNoWindow = false;
 | 
			
		||||
            ilasmProc.StartInfo.RedirectStandardOutput = true;
 | 
			
		||||
            ilasmProc.Start();
 | 
			
		||||
            ilasmProc.WaitForExit();
 | 
			
		||||
 | 
			
		||||
            if (ilasmProc.ExitCode != 0)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: Unable to assemble!");
 | 
			
		||||
                Console.WriteLine(ilasmProc.StandardOutput.ReadToEnd());
 | 
			
		||||
                return ilasmProc.ExitCode;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Cleanup
 | 
			
		||||
            File.Delete(targetIlName);
 | 
			
		||||
            File.Delete(targetResName);
 | 
			
		||||
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Finds path to ilasm.exe.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        private static string FindIlasmPath(bool x64)
 | 
			
		||||
        {
 | 
			
		||||
            var arch = x64 ? DotNetFrameworkArchitecture.Bitness64 : DotNetFrameworkArchitecture.Bitness32;
 | 
			
		||||
            var path = ToolLocationHelper.GetPathToDotNetFrameworkFile(
 | 
			
		||||
                "ilasm.exe", TargetDotNetFrameworkVersion.Version20, arch);
 | 
			
		||||
            return File.Exists(path) ? path : null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Finds path to ildasm.exe.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        private static string FindIldasmPath()
 | 
			
		||||
        {
 | 
			
		||||
            var sdkPath = Environment.ExpandEnvironmentVariables(@"%ProgramFiles%\Microsoft SDKs\Windows\");
 | 
			
		||||
            if (!Directory.Exists(sdkPath))
 | 
			
		||||
            {
 | 
			
		||||
                sdkPath = Environment.ExpandEnvironmentVariables(@"%ProgramFiles(x86)%\Microsoft SDKs\Windows\");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!Directory.Exists(sdkPath))
 | 
			
		||||
            {
 | 
			
		||||
                throw new DirectoryNotFoundException("'Microsoft SDKs' directory not found");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Get the version directories.
 | 
			
		||||
            var sdkVersionDirectories = Directory.GetDirectories(sdkPath);
 | 
			
		||||
            foreach (var sdkVersionDirectory in sdkVersionDirectories)
 | 
			
		||||
            {
 | 
			
		||||
                var binDirectory = Path.Combine(sdkVersionDirectory, @"bin");
 | 
			
		||||
                if (!Directory.Exists(binDirectory))
 | 
			
		||||
                {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Check for e.g. 'Microsoft SDKs\v8.0A\bin\ildasm.exe'.
 | 
			
		||||
                var ildasmPath = Path.Combine(binDirectory, @"ildasm.exe");
 | 
			
		||||
                if (File.Exists(ildasmPath))
 | 
			
		||||
                {
 | 
			
		||||
                    return ildasmPath;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Check for e.g. 'Microsoft SDKs\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe'.
 | 
			
		||||
                var toolsDirectories = Directory.GetDirectories(binDirectory, "NETFX*Tools");
 | 
			
		||||
                foreach (var toolDirectory in toolsDirectories)
 | 
			
		||||
                {
 | 
			
		||||
                    ildasmPath = Path.Combine(toolDirectory, @"ildasm.exe");
 | 
			
		||||
                    if (File.Exists(ildasmPath))
 | 
			
		||||
                    {
 | 
			
		||||
                        return ildasmPath;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
/*
 | 
			
		||||
  Copyright (C) 2011 Birunthan Mohanathas
 | 
			
		||||
 | 
			
		||||
  This program is free software; you can redistribute it and/or
 | 
			
		||||
  modify it under the terms of the GNU General Public License
 | 
			
		||||
  as published by the Free Software Foundation; either version 2
 | 
			
		||||
  of the License, or (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
  This program is distributed in the hope that it will be useful,
 | 
			
		||||
  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
  GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
  You should have received a copy of the GNU General Public License
 | 
			
		||||
  along with this program; if not, write to the Free Software
 | 
			
		||||
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using Microsoft.Build.Utilities;
 | 
			
		||||
using System.IO;
 | 
			
		||||
 | 
			
		||||
namespace DllExporter
 | 
			
		||||
{
 | 
			
		||||
    class Program
 | 
			
		||||
    {
 | 
			
		||||
        static int Main(string[] args)
 | 
			
		||||
        {
 | 
			
		||||
            if (args.Length < 4)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: Invalid arguments");
 | 
			
		||||
                return 1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            string configurationName = args[0];
 | 
			
		||||
            string platformTarget = args[1];
 | 
			
		||||
            string targetDirectory = args[2];
 | 
			
		||||
            string targetDllName = targetDirectory + args[3];
 | 
			
		||||
            string targetIlName = targetDllName + ".il";
 | 
			
		||||
            string targetResName = targetDllName + ".res";
 | 
			
		||||
 | 
			
		||||
            bool is64 = platformTarget.ToLower().Equals("x64");
 | 
			
		||||
            bool isDebug = configurationName.ToLower().Equals("debug");
 | 
			
		||||
 | 
			
		||||
            string ilasmPath = FindIlasmPath(is64);
 | 
			
		||||
            if (ilasmPath == null)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: ilasm.exe not found");
 | 
			
		||||
                return 1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            string ildasmPath = FindIldasmPath();
 | 
			
		||||
            if (ildasmPath == null)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: ildasm.exe not found");
 | 
			
		||||
                return 1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Directory.SetCurrentDirectory(targetDirectory);
 | 
			
		||||
 | 
			
		||||
            // Disassemble
 | 
			
		||||
            Process ildasmProc = new Process();
 | 
			
		||||
            string ildasmArgs = string.Format(
 | 
			
		||||
                "/nobar {0} /output=\"{1}\" \"{2}\"",
 | 
			
		||||
                isDebug ? "/linenum" : "",
 | 
			
		||||
                targetIlName,
 | 
			
		||||
                targetDllName);
 | 
			
		||||
 | 
			
		||||
            ildasmProc.StartInfo = new ProcessStartInfo(ildasmPath, ildasmArgs);
 | 
			
		||||
            ildasmProc.StartInfo.UseShellExecute = false;
 | 
			
		||||
            ildasmProc.StartInfo.CreateNoWindow = false;
 | 
			
		||||
            ildasmProc.StartInfo.RedirectStandardOutput = true;
 | 
			
		||||
            ildasmProc.Start();
 | 
			
		||||
            ildasmProc.WaitForExit();
 | 
			
		||||
 | 
			
		||||
            if (ildasmProc.ExitCode != 0)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: Unable to disassemble!");
 | 
			
		||||
                Console.WriteLine(ildasmProc.StandardOutput.ReadToEnd());
 | 
			
		||||
                return ildasmProc.ExitCode;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            bool hasResource = File.Exists(targetResName);
 | 
			
		||||
 | 
			
		||||
            // Read disassembly and find methods marked with DllExport attribute
 | 
			
		||||
            List<string> lines = new List<string>(File.ReadAllLines(targetIlName));
 | 
			
		||||
            int attributeIndex = 0;
 | 
			
		||||
            int exportCount = 0;
 | 
			
		||||
            while (true)
 | 
			
		||||
            {
 | 
			
		||||
                attributeIndex = lines.FindIndex(attributeIndex, new Predicate<string>(x => x.Contains(".custom instance void") && x.Contains("DllExport::.ctor()")));
 | 
			
		||||
                if (attributeIndex < 8) break;
 | 
			
		||||
 | 
			
		||||
                int methodIndex = lines.FindLastIndex(attributeIndex, attributeIndex, new Predicate<string>(x => x.Contains(".method")));
 | 
			
		||||
                if (methodIndex == -1)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine("DllExporter error: Unable to parse disassembly (.method not found)!");
 | 
			
		||||
                    return 1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                int functionIndex = lines.FindIndex(methodIndex, new Predicate<string>(x => x.Contains("(")));
 | 
			
		||||
                if (functionIndex == -1)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine("DllExporter error: Unable to parse disassembly (bracket not found)!");
 | 
			
		||||
                    return 1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                int bracketPos = lines[functionIndex].IndexOf('(');
 | 
			
		||||
                int functionNamePos = lines[functionIndex].LastIndexOf(' ', bracketPos);
 | 
			
		||||
                string functionName = lines[functionIndex].Substring(functionNamePos, bracketPos - functionNamePos);
 | 
			
		||||
 | 
			
		||||
                // Change calling convention to cdecl
 | 
			
		||||
                lines[functionIndex] = string.Format("{0} modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) {1}", lines[functionIndex].Substring(0, functionNamePos - 1), lines[functionIndex].Substring(functionNamePos));
 | 
			
		||||
 | 
			
		||||
                int attributeBeginPos = lines[attributeIndex].IndexOf('.');
 | 
			
		||||
                string spaces = new string(' ', attributeBeginPos);
 | 
			
		||||
 | 
			
		||||
                // Replace attribute with export
 | 
			
		||||
                ++exportCount;
 | 
			
		||||
                lines[attributeIndex] = string.Format("{0}.export [{1}] as {2}", spaces, exportCount, functionName);
 | 
			
		||||
 | 
			
		||||
                ++attributeIndex;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (exportCount == 0)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter warning: Nothing found to export.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Remove the DllExport class
 | 
			
		||||
            int classIndex = lines.FindIndex(new Predicate<string>(x => x.Contains(".class ") && x.EndsWith(".DllExport")));
 | 
			
		||||
            if (classIndex == -1)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: Unable to parse disassembly (DllExport class not found)!");
 | 
			
		||||
                return 1;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                int classEndIndex = lines.FindIndex(classIndex, new Predicate<string>(x => x.Contains("} // end of class") && x.EndsWith(".DllExport")));
 | 
			
		||||
                if (classEndIndex == -1)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine("DllExporter error: Unable to parse disassembly (DllExport class end not found)!");
 | 
			
		||||
                    return 1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                lines.RemoveRange(classIndex, classEndIndex - classIndex + 2);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Write everything back
 | 
			
		||||
            File.WriteAllLines(targetIlName, lines.ToArray());
 | 
			
		||||
 | 
			
		||||
            // Reassemble
 | 
			
		||||
            Process ilasmProc = new Process();
 | 
			
		||||
            string resource = hasResource ? string.Format("/resource=\"{0}\"", targetResName) : "";
 | 
			
		||||
            string ilasmArgs = string.Format("/nologo /quiet /dll {0} {1} /output=\"{2}\" {3} \"{4}\"", isDebug ? "/debug /pdb" : "/optimize", is64 ? "/x64 /PE64" : "", targetDllName, resource, targetIlName);
 | 
			
		||||
            ilasmProc.StartInfo = new ProcessStartInfo(ilasmPath, ilasmArgs);
 | 
			
		||||
            ilasmProc.StartInfo.UseShellExecute = false;
 | 
			
		||||
            ilasmProc.StartInfo.CreateNoWindow = false;
 | 
			
		||||
            ilasmProc.StartInfo.RedirectStandardOutput = true;
 | 
			
		||||
            ilasmProc.Start();
 | 
			
		||||
            ilasmProc.WaitForExit();
 | 
			
		||||
 | 
			
		||||
            if (ilasmProc.ExitCode != 0)
 | 
			
		||||
            {
 | 
			
		||||
                Console.WriteLine("DllExporter error: Unable to assemble!");
 | 
			
		||||
                Console.WriteLine(ilasmProc.StandardOutput.ReadToEnd());
 | 
			
		||||
                return ilasmProc.ExitCode;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Cleanup
 | 
			
		||||
            File.Delete(targetIlName);
 | 
			
		||||
            File.Delete(targetResName);
 | 
			
		||||
 | 
			
		||||
            Console.WriteLine("DllExporter: Processed {0}", args[3]);
 | 
			
		||||
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Finds path to ilasm.exe.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        private static string FindIlasmPath(bool x64)
 | 
			
		||||
        {
 | 
			
		||||
            var arch = x64 ? DotNetFrameworkArchitecture.Bitness64 : DotNetFrameworkArchitecture.Bitness32;
 | 
			
		||||
            var path = ToolLocationHelper.GetPathToDotNetFrameworkFile(
 | 
			
		||||
                "ilasm.exe", TargetDotNetFrameworkVersion.Version20, arch);
 | 
			
		||||
            return File.Exists(path) ? path : null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Finds path to ildasm.exe.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        private static string FindIldasmPath()
 | 
			
		||||
        {
 | 
			
		||||
            var sdkPath = Environment.ExpandEnvironmentVariables(@"%ProgramFiles%\Microsoft SDKs\Windows\");
 | 
			
		||||
            if (!Directory.Exists(sdkPath))
 | 
			
		||||
            {
 | 
			
		||||
                sdkPath = Environment.ExpandEnvironmentVariables(@"%ProgramFiles(x86)%\Microsoft SDKs\Windows\");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!Directory.Exists(sdkPath))
 | 
			
		||||
            {
 | 
			
		||||
                throw new DirectoryNotFoundException("'Microsoft SDKs' directory not found");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Get the version directories.
 | 
			
		||||
            var sdkVersionDirectories = Directory.GetDirectories(sdkPath);
 | 
			
		||||
            foreach (var sdkVersionDirectory in sdkVersionDirectories)
 | 
			
		||||
            {
 | 
			
		||||
                var binDirectory = Path.Combine(sdkVersionDirectory, @"bin");
 | 
			
		||||
                if (!Directory.Exists(binDirectory))
 | 
			
		||||
                {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Check for e.g. 'Microsoft SDKs\v8.0A\bin\ildasm.exe'.
 | 
			
		||||
                var ildasmPath = Path.Combine(binDirectory, @"ildasm.exe");
 | 
			
		||||
                if (File.Exists(ildasmPath))
 | 
			
		||||
                {
 | 
			
		||||
                    return ildasmPath;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Check for e.g. 'Microsoft SDKs\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe'.
 | 
			
		||||
                var toolsDirectories = Directory.GetDirectories(binDirectory, "NETFX*Tools");
 | 
			
		||||
                foreach (var toolDirectory in toolsDirectories)
 | 
			
		||||
                {
 | 
			
		||||
                    ildasmPath = Path.Combine(toolDirectory, @"ildasm.exe");
 | 
			
		||||
                    if (File.Exists(ildasmPath))
 | 
			
		||||
                    {
 | 
			
		||||
                        return ildasmPath;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -97,9 +97,9 @@
 | 
			
		||||
      <DependentUpon>InputBox.cs</DependentUpon>
 | 
			
		||||
    </EmbeddedResource>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <Import Project="$(SolutionDir)Build\VS\RainmeterPlugin.Cs.props"/>
 | 
			
		||||
  <Import Project="$(SolutionDir)Build\VS\RainmeterPlugin.Cs.props" />
 | 
			
		||||
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <PostBuildEvent>"$(SolutionDir)Plugins\API\DllExporter.exe" "$(ConfigurationName)" "$(PlatformName)" "$(TargetDir)\" "$(TargetFileName)"</PostBuildEvent>
 | 
			
		||||
    <PostBuildEvent>"$(RmOutDirRoot)Tools\DllExporter.exe" "$(ConfigurationName)" "$(PlatformName)" "$(TargetDir)\" "$(TargetFileName)"</PostBuildEvent>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
@@ -9,6 +9,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "Common\Common.vcx
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common_Test", "Common\Common_Test.vcxproj", "{442084A6-2069-4927-B0C9-51525A720CB2}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DllExporter", "Build\DllExporter\DllExporter.csproj", "{49D56CA5-54AB-45C9-A245-EAE588FCBFE1}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Installer", "Installer\Installer.vcxproj", "{2FCFBFD2-2720-4BDD-B620-4BDD3DBB8D3D}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Language", "Language\Language.vcxproj", "{6BE6F228-B741-4DA9-9FBC-E9F2A7BD483A}"
 | 
			
		||||
@@ -32,8 +34,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SkinInstallerLauncher", "Sk
 | 
			
		||||
		{6F5D4C4A-C8C3-41DA-BF44-6D42B76464DA} = {6F5D4C4A-C8C3-41DA-BF44-6D42B76464DA}
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DllExporter", "Plugins\API\DllExporter\DllExporter.csproj", "{49D56CA5-54AB-45C9-A245-EAE588FCBFE1}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PluginAdvancedCPU", "Plugins\PluginAdvancedCPU\PluginAdvancedCPU.vcxproj", "{EE8EC522-8430-4B46-86A3-D943D77F9E4B}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PluginCoreTemp", "Plugins\PluginCoreTemp\PluginCoreTemp.vcxproj", "{F32FA418-8DF4-4E94-B92B-EBD502F5DC07}"
 | 
			
		||||
@@ -43,6 +43,9 @@ EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PluginFolderInfo", "Plugins\PluginFolderInfo\PluginFolderInfo.vcxproj", "{A221819D-4263-42AA-B22A-C022924842A7}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginInputText", "Plugins\PluginInputText\PluginInputText.csproj", "{2CFEC79A-E39E-4FFD-ABC2-C4A69DD1E44D}"
 | 
			
		||||
	ProjectSection(ProjectDependencies) = postProject
 | 
			
		||||
		{49D56CA5-54AB-45C9-A245-EAE588FCBFE1} = {49D56CA5-54AB-45C9-A245-EAE588FCBFE1}
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PluginiTunes", "Plugins\PluginiTunes\PluginiTunes.vcxproj", "{A2DD3CBE-B140-4892-A875-24107FA52518}"
 | 
			
		||||
EndProject
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user