diff --git a/Source/Reloaded.Assembler/Assembler.cs b/Source/Reloaded.Assembler/Assembler.cs index 72fb137..c03bb48 100644 --- a/Source/Reloaded.Assembler/Assembler.cs +++ b/Source/Reloaded.Assembler/Assembler.cs @@ -22,6 +22,7 @@ You should have received a copy of the GNU General Public License using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading; @@ -76,17 +77,13 @@ public Assembler(int textSize = 0x10000, int resultSize = 0x8000) IntPtr fasmDllHandle; - // Set functions - if (IntPtr.Size == 4) - fasmDllHandle = LoadLibraryW("FASM.dll"); - else if (IntPtr.Size == 8) - fasmDllHandle = LoadLibraryW("FASMX64.dll"); - else - { - // Does not actually check OS or architecture but it should be good enough for our purposes. - // Users should know that this is a Windows lib for x86/x64 - throw new FasmWrapperException("Only 32bit and 64bit desktop architectures are supported (X86 and X86_64)."); - } + // Get path of FASM dll + string fasmDllPath = GetFasmDLLPath(); + fasmDllHandle = LoadLibraryW(fasmDllPath); + + // Throw exception if dll not loaded. + if (fasmDllHandle == null) + throw new FasmWrapperException("Failed to load FASM dll. The FASM dll pointer from LoadLibraryW is null."); // Obtain delegates to FASM functions. IntPtr assembleAddress = GetProcAddress(fasmDllHandle, "fasm_Assemble"); @@ -192,6 +189,44 @@ public byte[] Assemble(string mnemonics, ushort passLimit = 100) } } + /// + /// Retrieves the path of the FASM dll to load. + /// + private string GetFasmDLLPath() + { + const string FASM86DLL = "FASM.dll"; + const string FASM64DLL = "FASMX64.dll"; + + // Check current directory. + if (IntPtr.Size == 4 && File.Exists(FASM86DLL)) + return FASM86DLL; + else if (IntPtr.Size == 8 && File.Exists(FASM64DLL)) + return FASM64DLL; + + // Check DLL Directory + string assemblyDirectory = GetExecutingDLLDirectory(); + string asmDirectoryFasm86 = Path.Combine(assemblyDirectory, FASM86DLL); + string asmDirectoryFasm64 = Path.Combine(assemblyDirectory, FASM64DLL); + + if (IntPtr.Size == 4 && File.Exists(asmDirectoryFasm86)) + return asmDirectoryFasm86; + else if (IntPtr.Size == 8 && File.Exists(asmDirectoryFasm64)) + return asmDirectoryFasm64; + + throw new FasmWrapperException("Appropriate FASM DLL for X86/64 has not been found in either current or library directory."); + } + + /// + /// Gets the directory of the currently executing assembly. + /// + private string GetExecutingDLLDirectory() + { + string codeBase = Assembly.GetExecutingAssembly().CodeBase; + UriBuilder uri = new UriBuilder(codeBase); + string path = Uri.UnescapeDataString(uri.Path); + return Path.GetDirectoryName(path); + } + /// /// Attempts to allocate the memory to store the text to be supplied to FASM assembler. /// diff --git a/Source/Reloaded.Assembler/Reloaded.Assembler.csproj b/Source/Reloaded.Assembler/Reloaded.Assembler.csproj index 40710d6..3df8eff 100644 --- a/Source/Reloaded.Assembler/Reloaded.Assembler.csproj +++ b/Source/Reloaded.Assembler/Reloaded.Assembler.csproj @@ -21,7 +21,7 @@ https://avatars1.githubusercontent.com/u/45473408?s=400&u=b591dd9f053703e87a08ccc56287a9119e9758cb&v=4 git https://github.com/Reloaded-Project/Reloaded.Assembler - 1.0.5 + 1.0.6 LICENSE