Fortunevale_Xorog_UniversalExtensions/Tools/WindowsAPI/WindowsUtils.cs
using System.Runtime.CompilerServices;

namespace Xorog.UniversalExtensions.WindowsAPI;

public class WindowsUtils
{
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static FileInfo? GetMainModuleFilepath(int pid)
    {
        var processHandle = kernel32.OpenProcess(0x0400 | 0x0010, false, pid);

        if (processHandle == IntPtr.Zero)
            return null;

        const int lengthSb = 4000;

        var sb = new StringBuilder(lengthSb);

        string? result = null;

        if (psapi.GetModuleFileNameEx(processHandle, IntPtr.Zero, sb, lengthSb) > 0)
        {
            result = Path.GetFullPath(sb.ToString());
        }

        kernel32.CloseHandle(processHandle);

        if (result == null)
            return null;

        return new FileInfo(result);
    }
}
