From 458584d778cbba9ff4aa8acc172bf08c635021c8 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Wed, 13 Mar 2024 19:49:48 +0100 Subject: [PATCH] feat: Added logger module to script loader --- plugins/script_loader/CMakeLists.txt | 1 + .../dotnet/AssemblyLoader/Program.cs | 39 +++++++++- .../source/script_api/v1/logger.cpp | 34 ++++++++ .../CSharp/ImHexLibrary/Bookmarks.cs | 4 +- .../templates/CSharp/ImHexLibrary/Library.cs | 9 +++ .../templates/CSharp/ImHexLibrary/Logger.cs | 78 +++++++++++++++++++ .../templates/CSharp/ImHexLibrary/Memory.cs | 4 +- .../templates/CSharp/ImHexScript/Program.cs | 12 +-- 8 files changed, 161 insertions(+), 20 deletions(-) create mode 100644 plugins/script_loader/source/script_api/v1/logger.cpp create mode 100644 plugins/script_loader/templates/CSharp/ImHexLibrary/Library.cs create mode 100644 plugins/script_loader/templates/CSharp/ImHexLibrary/Logger.cs diff --git a/plugins/script_loader/CMakeLists.txt b/plugins/script_loader/CMakeLists.txt index af0f6c79c..88625d3e7 100644 --- a/plugins/script_loader/CMakeLists.txt +++ b/plugins/script_loader/CMakeLists.txt @@ -38,6 +38,7 @@ if (CoreClrEmbed_FOUND) source/script_api/v1/mem.cpp source/script_api/v1/bookmarks.cpp source/script_api/v1/ui.cpp + source/script_api/v1/logger.cpp ) set(EXTRA_BUNDLE_LIBRARY_PATHS "${CoreClrEmbed_FOLDER}" PARENT_SCOPE) diff --git a/plugins/script_loader/dotnet/AssemblyLoader/Program.cs b/plugins/script_loader/dotnet/AssemblyLoader/Program.cs index b69550b71..64662234a 100644 --- a/plugins/script_loader/dotnet/AssemblyLoader/Program.cs +++ b/plugins/script_loader/dotnet/AssemblyLoader/Program.cs @@ -1,6 +1,5 @@ using System.Reflection; using System.Runtime.InteropServices; -using System.Runtime.InteropServices.ComTypes; using System.Runtime.Loader; namespace ImHex @@ -47,6 +46,7 @@ namespace ImHex { if (type is "LOAD") { + // If the script has been loaded already, don't do it again if (loadedPlugins.Contains(path)) { return 0; @@ -65,19 +65,49 @@ namespace ImHex continue; } + // Load the Assembly try { context.LoadFromStream(new MemoryStream(File.ReadAllBytes(file))); } catch (Exception e) { - Console.WriteLine("[.NET Script] Failed to load assembly: " + file + " - " + e.ToString()); + Console.WriteLine("[.NET Script] Failed to load assembly: " + file + " - " + e); } } // Load the script assembly var assembly = context.LoadFromStream(new MemoryStream(File.ReadAllBytes(path))); + // Find ImHexLibrary module + var libraryModule = Array.Find(context.Assemblies.ToArray(), module => module.GetName().Name == "ImHexLibrary"); + if (libraryModule == null) + { + Console.WriteLine("[.NET Script] Refusing to load non-ImHex script"); + return 1; + } + else + { + // Load Library type + var libraryType = libraryModule.GetType("Library"); + if (libraryType == null) + { + Console.WriteLine("[.NET Script] Failed to find Library type in ImHexLibrary"); + return 1; + } + + // Load Initialize function in the Library type + var initMethod = libraryType.GetMethod("Initialize", BindingFlags.Static | BindingFlags.Public); + if (initMethod == null) + { + Console.WriteLine("[.NET Script] Failed to find Initialize method"); + return 1; + } + + // Execute it + initMethod.Invoke(null, null); + } + // Find a class named "Script" var entryPointType = assembly.GetType("Script"); if (entryPointType == null) @@ -96,10 +126,11 @@ namespace ImHex } // Execute it - method.Invoke(null, null); + method.Invoke(null, null); } else if (type == "CHECK") { + // Check if the method exists return entryPointType.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public) != null ? 0 : 1; } else @@ -109,7 +140,7 @@ namespace ImHex } catch (Exception e) { - Console.WriteLine("[.NET Script] Exception in AssemblyLoader: " + e.ToString()); + Console.WriteLine("[.NET Script] Exception in AssemblyLoader: " + e); return 3; } finally diff --git a/plugins/script_loader/source/script_api/v1/logger.cpp b/plugins/script_loader/source/script_api/v1/logger.cpp new file mode 100644 index 000000000..8cd2dfb04 --- /dev/null +++ b/plugins/script_loader/source/script_api/v1/logger.cpp @@ -0,0 +1,34 @@ +#include + +#include +#include + +#define VERSION V1 + +SCRIPT_API(void logPrint, const char *message) { + hex::log::print("{}", message); +} + +SCRIPT_API(void logPrintln, const char *message) { + hex::log::println("{}", message); +} + +SCRIPT_API(void logDebug, const char *message) { + hex::log::debug("{}", message); +} + +SCRIPT_API(void logInfo, const char *message) { + hex::log::info("{}", message); +} + +SCRIPT_API(void logWarn, const char *message) { + hex::log::warn("{}", message); +} + +SCRIPT_API(void logError, const char *message) { + hex::log::error("{}", message); +} + +SCRIPT_API(void logFatal, const char *message) { + hex::log::fatal("{}", message); +} \ No newline at end of file diff --git a/plugins/script_loader/templates/CSharp/ImHexLibrary/Bookmarks.cs b/plugins/script_loader/templates/CSharp/ImHexLibrary/Bookmarks.cs index fd233a260..630dcec82 100644 --- a/plugins/script_loader/templates/CSharp/ImHexLibrary/Bookmarks.cs +++ b/plugins/script_loader/templates/CSharp/ImHexLibrary/Bookmarks.cs @@ -1,6 +1,4 @@ -#pragma warning disable SYSLIB1054 - -using System.Drawing; +using System.Drawing; using System.Runtime.InteropServices; using System.Text; diff --git a/plugins/script_loader/templates/CSharp/ImHexLibrary/Library.cs b/plugins/script_loader/templates/CSharp/ImHexLibrary/Library.cs new file mode 100644 index 000000000..919d9d8d4 --- /dev/null +++ b/plugins/script_loader/templates/CSharp/ImHexLibrary/Library.cs @@ -0,0 +1,9 @@ +using ImHex; + +public class Library +{ + public static void Initialize() + { + Logger.RedirectConsole(); + } +} \ No newline at end of file diff --git a/plugins/script_loader/templates/CSharp/ImHexLibrary/Logger.cs b/plugins/script_loader/templates/CSharp/ImHexLibrary/Logger.cs new file mode 100644 index 000000000..6adbb7599 --- /dev/null +++ b/plugins/script_loader/templates/CSharp/ImHexLibrary/Logger.cs @@ -0,0 +1,78 @@ +using System.Runtime.InteropServices; +using System.Text; + +#pragma warning disable SYSLIB1054 + +namespace ImHex +{ + public partial class Logger + { + [LibraryImport("ImHex")] + private static partial void logPrintV1(byte[] message); + + [LibraryImport("ImHex")] + private static partial void logPrintlnV1(byte[] message); + + [LibraryImport("ImHex")] + private static partial void logDebugV1(byte[] message); + + [LibraryImport("ImHex")] + private static partial void logInfoV1(byte[] message); + + [LibraryImport("ImHex")] + private static partial void logWarnV1(byte[] message); + + [LibraryImport("ImHex")] + private static partial void logErrorV1(byte[] message); + + [LibraryImport("ImHex")] + private static partial void logFatalV1(byte[] message); + + + public static void Debug(string message) + { + logDebugV1(Encoding.UTF8.GetBytes(message)); + } + + public static void Info(string message) + { + logInfoV1(Encoding.UTF8.GetBytes(message)); + } + + public static void Warn(string message) + { + logWarnV1(Encoding.UTF8.GetBytes(message)); + } + + public static void Error(string message) + { + logErrorV1(Encoding.UTF8.GetBytes(message)); + } + + public static void Fatal(string message) + { + logFatalV1(Encoding.UTF8.GetBytes(message)); + } + + + private class LoggerWriter : TextWriter + { + public override Encoding Encoding => Encoding.UTF8; + + public override void Write(string? value) + { + logPrintV1(Encoding.GetBytes(value ?? string.Empty)); + } + + public override void WriteLine(string? value) + { + logPrintlnV1(Encoding.GetBytes(value ?? string.Empty)); + } + } + + public static void RedirectConsole() + { + Console.SetOut(new LoggerWriter()); + } + } +} \ No newline at end of file diff --git a/plugins/script_loader/templates/CSharp/ImHexLibrary/Memory.cs b/plugins/script_loader/templates/CSharp/ImHexLibrary/Memory.cs index 0f2a138c8..e66b99e27 100644 --- a/plugins/script_loader/templates/CSharp/ImHexLibrary/Memory.cs +++ b/plugins/script_loader/templates/CSharp/ImHexLibrary/Memory.cs @@ -1,6 +1,4 @@ -#pragma warning disable SYSLIB1054 - -using System.Runtime.InteropServices; +using System.Runtime.InteropServices; using System.Text; namespace ImHex diff --git a/plugins/script_loader/templates/CSharp/ImHexScript/Program.cs b/plugins/script_loader/templates/CSharp/ImHexScript/Program.cs index 9af806c82..047fee9c2 100644 --- a/plugins/script_loader/templates/CSharp/ImHexScript/Program.cs +++ b/plugins/script_loader/templates/CSharp/ImHexScript/Program.cs @@ -2,17 +2,9 @@ using ImGuiNET; class Script { - public static void OnLoad() { + public static void OnLoad() + { // This function is executed the first time the Plugin is loaded - UI.RegisterView(new byte[]{ 0xEE, 0xAC, 0x89 }, "Test View", () => - { - ImGui.SetCurrentContext(UI.GetImGuiContext()); - ImGui.TextUnformatted("Test Text"); - if (ImGui.Button("Hello World")) - { - UI.ShowToast("Hello World"); - } - }); } public static void Main()