From 2e4796f8bfd94a552380189429b14bce1cdaa4ce Mon Sep 17 00:00:00 2001 From: Mino Date: Sun, 29 Mar 2020 13:38:48 +0900 Subject: [PATCH] Add GetImageFilePath --- Dalamud.Bootstrap/Bootstrapper.cs | 6 ++++-- Dalamud.Bootstrap/SqexArg/ArgumentBuilder.cs | 1 + Dalamud.Bootstrap/Windows/Process.cs | 18 ++++++++++++++++++ Dalamud.Bootstrap/Windows/ProcessException.cs | 2 +- Dalamud.Bootstrap/Windows/Win32.cs | 7 ++++++- Dalamud.Injector/Program.cs | 10 +++++++++- 6 files changed, 39 insertions(+), 5 deletions(-) diff --git a/Dalamud.Bootstrap/Bootstrapper.cs b/Dalamud.Bootstrap/Bootstrapper.cs index 6439de56a..f97f43202 100644 --- a/Dalamud.Bootstrap/Bootstrapper.cs +++ b/Dalamud.Bootstrap/Bootstrapper.cs @@ -21,7 +21,8 @@ namespace Dalamud.Bootstrap { commandLine = commandLine ?? ""; - throw new NotImplementedException("TODO"); + + //throw new NotImplementedException("TODO"); } /// @@ -54,6 +55,8 @@ namespace Dalamud.Bootstrap // Acquire the process handle and read the command line using var process = Process.Open(pid); + var exePath = process.GetImageFilePath(); + var argument = ReadArgumentFromProcess(process); var newTick = (uint)Environment.TickCount; @@ -66,7 +69,6 @@ namespace Dalamud.Bootstrap var encryptedArgument = new EncryptedArgument(newArgument, newKey); - // TODO: launch new exe with the argument from encryptedArgument.ToString() diff --git a/Dalamud.Bootstrap/SqexArg/ArgumentBuilder.cs b/Dalamud.Bootstrap/SqexArg/ArgumentBuilder.cs index 7b9176f34..0ef3e210f 100644 --- a/Dalamud.Bootstrap/SqexArg/ArgumentBuilder.cs +++ b/Dalamud.Bootstrap/SqexArg/ArgumentBuilder.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Text; diff --git a/Dalamud.Bootstrap/Windows/Process.cs b/Dalamud.Bootstrap/Windows/Process.cs index 262a9bf5f..451d14434 100644 --- a/Dalamud.Bootstrap/Windows/Process.cs +++ b/Dalamud.Bootstrap/Windows/Process.cs @@ -3,6 +3,7 @@ using Microsoft.Win32.SafeHandles; using System; using System.ComponentModel; using System.Runtime.InteropServices; +using System.Text; namespace Dalamud.Bootstrap { @@ -210,5 +211,22 @@ namespace Dalamud.Bootstrap } } } + + public string GetImageFilePath() + { + var buffer = new StringBuilder(300); + + // From docs: + // On input, specifies the size of the lpExeName buffer, in characters. + // On success, receives the number of characters written to the buffer, not including the null-terminating character. + var size = buffer.Capacity; + + if (!Win32.QueryFullProcessImageNameW(m_handle, 0, buffer, ref size)) + { + ProcessException.ThrowLastOsError(GetPid()); + } + + return buffer.ToString(); + } } } diff --git a/Dalamud.Bootstrap/Windows/ProcessException.cs b/Dalamud.Bootstrap/Windows/ProcessException.cs index f93c9f95c..f935b3ec2 100644 --- a/Dalamud.Bootstrap/Windows/ProcessException.cs +++ b/Dalamud.Bootstrap/Windows/ProcessException.cs @@ -20,7 +20,7 @@ namespace Dalamud.Bootstrap.Windows internal ProcessException(string message, uint pid, Exception innerException) : base(message, innerException) => Pid = pid; - internal static ProcessException ThrowLastOsError(uint pid) + internal static void ThrowLastOsError(uint pid) { var inner = new Win32Exception(); diff --git a/Dalamud.Bootstrap/Windows/Win32.cs b/Dalamud.Bootstrap/Windows/Win32.cs index b986561f0..22275d052 100644 --- a/Dalamud.Bootstrap/Windows/Win32.cs +++ b/Dalamud.Bootstrap/Windows/Win32.cs @@ -1,6 +1,7 @@ using Microsoft.Win32.SafeHandles; using System; using System.Runtime.InteropServices; +using System.Text; namespace Dalamud.Bootstrap.Windows { @@ -27,7 +28,7 @@ namespace Dalamud.Bootstrap.Windows [DllImport("kernel32", CallingConvention = CallingConvention.Winapi, SetLastError = true)] public static extern void* LocalFree(void* hMem); - [DllImport("shell32", CallingConvention = CallingConvention.Winapi, SetLastError = true)] + [DllImport("shell32", CallingConvention = CallingConvention.Winapi, SetLastError = true, ExactSpelling = true)] public static extern char** CommandLineToArgvW(void* lpCmdLine, int* pNumArgs); [DllImport("kernel32", CallingConvention = CallingConvention.Winapi)] @@ -36,6 +37,10 @@ namespace Dalamud.Bootstrap.Windows [DllImport("kernel32", CallingConvention = CallingConvention.Winapi, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetProcessTimes(SafeProcessHandle hProcess, FileTime* lpCreationTime, FileTime* lpExitTime, FileTime* lpKernelTime, FileTime* lpUserTime); + + [DllImport("kernel32", CallingConvention = CallingConvention.Winapi, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool QueryFullProcessImageNameW(SafeProcessHandle hProcess, uint dwFlags, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder lpExeName, ref int lpdwSize); } [StructLayout(LayoutKind.Sequential)] diff --git a/Dalamud.Injector/Program.cs b/Dalamud.Injector/Program.cs index 1f608f3cb..18ba8f4b0 100644 --- a/Dalamud.Injector/Program.cs +++ b/Dalamud.Injector/Program.cs @@ -9,7 +9,15 @@ namespace Dalamud.Injector internal static class Program { private static void Main(string[] args) - { + { + var boot = new Bootstrapper(new BootstrapperOptions + { + BinaryDirectory = "", + RootDirectory = "", + }); + + boot.Launch("", ""); + Parser.Default.ParseArguments(args) .WithParsed(Inject) .WithParsed(Launch);