mirror of
				https://github.com/chibicitiberiu/rainmeter-studio.git
				synced 2024-02-24 04:33:31 +00:00 
			
		
		
		
	Reintegrated 2.3 branch into trunk
This commit is contained in:
		
							
								
								
									
										7
									
								
								Plugins/API/DllExporter/AssemblyInfo.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Plugins/API/DllExporter/AssemblyInfo.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| using System.Reflection; | ||||
| using System.Runtime.CompilerServices; | ||||
| using System.Runtime.InteropServices; | ||||
|  | ||||
| [assembly: AssemblyCopyright("© 2011 - Birunthan Mohanathas")] | ||||
| [assembly: AssemblyVersion("1.0.0.0")] | ||||
| [assembly: AssemblyProduct("Rainmeter")] | ||||
							
								
								
									
										101
									
								
								Plugins/API/DllExporter/DllExporter.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								Plugins/API/DllExporter/DllExporter.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="4.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>v2.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> | ||||
|     <StartAction>Program</StartAction> | ||||
|     <StartProgram>TestBench\x32\Debug\Rainmeter.exe</StartProgram> | ||||
|   </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> | ||||
|     <StartAction>Program</StartAction> | ||||
|     <StartProgram>TestBench\x32\Release\Rainmeter.exe</StartProgram> | ||||
|   </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> | ||||
|     <StartAction>Program</StartAction> | ||||
|     <StartProgram>TestBench\x64\Debug\Rainmeter.exe</StartProgram> | ||||
|   </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> | ||||
|     <StartAction>Program</StartAction> | ||||
|     <StartProgram>TestBench\x64\Release\Rainmeter.exe</StartProgram> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <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>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> | ||||
|   --> | ||||
| </Project> | ||||
							
								
								
									
										155
									
								
								Plugins/API/DllExporter/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								Plugins/API/DllExporter/Program.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,155 @@ | ||||
| /* | ||||
|   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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | ||||
| */ | ||||
|  | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| using System.Diagnostics; | ||||
|  | ||||
| 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"; | ||||
|             string ilasmPath = args[4]; | ||||
|             string ildasmPath = args[5]; | ||||
|  | ||||
|             System.IO.Directory.SetCurrentDirectory(targetDirectory); | ||||
|  | ||||
|             bool is64 = platformTarget.ToLower().Equals("x64"); | ||||
|             bool isDebug = configurationName.ToLower().Equals("debug"); | ||||
|  | ||||
|             // Disassemble | ||||
|             Process ildasmProc = new Process(); | ||||
|             string ildasmArgs = string.Format("/nobar /output={0} {1}", 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 = System.IO.File.Exists(targetResName); | ||||
|  | ||||
|             // Read disassembly and find methods marked with DllExport attribute | ||||
|             List<string> lines = new List<string>(System.IO.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 | ||||
|             System.IO.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 | ||||
|             System.IO.File.Delete(targetIlName); | ||||
|             System.IO.File.Delete(targetResName); | ||||
|  | ||||
|             return 0; | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Birunthan Mohanathas
					Birunthan Mohanathas