Add GetImageFilePath

This commit is contained in:
Mino 2020-03-29 13:38:48 +09:00
parent 6f6792f27e
commit 2e4796f8bf
6 changed files with 39 additions and 5 deletions

View file

@ -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();
}
}
}

View file

@ -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();

View file

@ -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)]