Release Elite Dangerous Odyssey Materials Helper

Problems appear to be related to users having UAC disabled. Enabling might fix your issue, but if you always had it disabled you might run into more problems. next version will have an exclusion for the check when UAC is disabled. having UAC disabled basically means any app has admin level access to your system, which is very very bad.
 
Hello, I'm having problems with EDOMH not showing the FC inventory. It is said that you should register the application to allow handling edomh links but whenever I click the button, it tries for a while, asks permission to registry console tool, which I allow, but then comes back as unregistered again. This has been going on for 2 years now, I checked the web and this was only talked once here in 2022 and that guy could not find any solution either.

Since three years have passed, I want to ask again, is there something I can do? I am on W11 64bit, EDOMH is installed on the same SSD with the game with its own folder at F: path, so it's not in Program Files or something.
 

Attachments

  • image_2025-08-03_112416509.png
    image_2025-08-03_112416509.png
    2.1 KB · Views: 71
Hello, I'm having problems with EDOMH not showing the FC inventory. It is said that you should register the application to allow handling edomh links but whenever I click the button, it tries for a while, asks permission to registry console tool, which I allow, but then comes back as unregistered again. This has been going on for 2 years now, I checked the web and this was only talked once here in 2022 and that guy could not find any solution either.

Since three years have passed, I want to ask again, is there something I can do? I am on W11 64bit, EDOMH is installed on the same SSD with the game with its own folder at F: path, so it's not in Program Files or something.
There is no solution to it as it is still unknown what is preventing it from being applied to some systems. a manual workaround is posted in the #information channel on the discord server if you install it in the default location: https://discord.com/channels/897226095299010600/1110492920668237855/1372959540236255303
 
Hello Jixxed,

I've been trying to solve an issue, but everything I tried changed nothing.
I'm trying to launch EDOMH through Voice-Attack, but when I do, I get that prompt, telling me that this program is elevated and shouldn't be.

In voice-attack, I have disabled admin privileges, then I can launch your program, however I am warned by EDCoPilot, that in this case certain features won't work and that it is suggested I run Voice-Attack with admin.

Now I've tried to launch EDOMH through an elevated Voice-Attack instance and force it to not run EDOMH as an adminitrator, but that doesn't work. In fact, in Voice-Attack there's even an option whether I want the application to run with admin. This option is unchecked. I was wondering if there is a reason why we cannot run EDOMH elevated and if it's more of a security concern, perhaps we can toggle an option within the app?

The interesting thing is, that I've not had problems running EDOMH this way, this issue has started about a month ago or so.

Any ideas?

I decided to write here, because I saw a similar issue being discussed on Voice-Attack and the developer had no fix, so I assume my case wouldn't be any different, therefore I thought I'd try by you first.
 
A lot of people run as regular user, but when something doesn't work for whatever reason, they try to start as administrator. This can cause issues later on when running again without admin privileges. this app is intended to never be ran as admin, it does not need that kind of access to your system. When it does need it, like when registering the app for edomh:// urls, it will ask for it.

You can use this powershell script to launch an unelevated program from an elevated shell, adjust accordingly. requires manual update of the auto updater to version 2.234
Code:
Add-Type @"
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

public class UnelevatedProcess {
    [DllImport("user32.dll")]
    public static extern IntPtr GetShellWindow();

    [DllImport("user32.dll", SetLastError=true)]
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    [DllImport("kernel32.dll", SetLastError=true)]
    public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);

    [DllImport("advapi32.dll", SetLastError=true)]
    public static extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, out IntPtr TokenHandle);

    [DllImport("advapi32.dll", SetLastError=true)]
    public static extern bool DuplicateTokenEx(
        IntPtr hExistingToken,
        uint dwDesiredAccess,
        IntPtr lpTokenAttributes,
        int ImpersonationLevel,
        int TokenType,
        out IntPtr phNewToken);

    [DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
    public static extern bool CreateProcessWithTokenW(
        IntPtr hToken,
        int dwLogonFlags,
        string lpApplicationName,
        string lpCommandLine,
        int dwCreationFlags,
        IntPtr lpEnvironment,
        string lpCurrentDirectory,
        ref STARTUPINFO lpStartupInfo,
        out PROCESS_INFORMATION lpProcessInformation);

    [StructLayout(LayoutKind.Sequential)]
    public struct STARTUPINFO {
        public int cb;
        public string lpReserved;
        public string lpDesktop;
        public string lpTitle;
        public int dwX;
        public int dwY;
        public int dwXSize;
        public int dwYSize;
        public int dwXCountChars;
        public int dwYCountChars;
        public int dwFillAttribute;
        public int dwFlags;
        public short wShowWindow;
        public short cbReserved2;
        public IntPtr lpReserved2;
        public IntPtr hStdInput;
        public IntPtr hStdOutput;
        public IntPtr hStdError;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct PROCESS_INFORMATION {
        public IntPtr hProcess;
        public IntPtr hThread;
        public int dwProcessId;
        public int dwThreadId;
    }

    const uint PROCESS_QUERY_INFORMATION = 0x0400;
    const uint TOKEN_DUPLICATE = 0x0002;
    const uint TOKEN_ASSIGN_PRIMARY = 0x0001;
    const uint TOKEN_QUERY = 0x0008;
    const uint TOKEN_ALL_ACCESS = 0xF01FF;
    const int SecurityImpersonation = 2;
    const int TokenPrimary = 1;

    public static bool Start(string exe, string args, string workingDir = null) {
        IntPtr hShellWnd = GetShellWindow();
        if (hShellWnd == IntPtr.Zero) return false;

        uint shellPID;
        GetWindowThreadProcessId(hShellWnd, out shellPID);

        IntPtr hShellProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, shellPID);
        if (hShellProcess == IntPtr.Zero) return false;

        IntPtr hShellToken;
        if (!OpenProcessToken(hShellProcess, TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_QUERY, out hShellToken))
            return false;

        IntPtr hUserToken;
        if (!DuplicateTokenEx(hShellToken, TOKEN_ALL_ACCESS, IntPtr.Zero, SecurityImpersonation, TokenPrimary, out hUserToken))
            return false;

        STARTUPINFO si = new STARTUPINFO();
        si.cb = Marshal.SizeOf(si);
        PROCESS_INFORMATION pi;

        bool result = CreateProcessWithTokenW(
            hUserToken,
            0,
            exe,
            args,
            0,
            IntPtr.Zero,
            workingDir,   // <-- pass working directory here
            ref si,
            out pi
        );

        return result;
    }
}
"@

# Example: launch EDOMH unelevated, even from elevated PowerShell
[UnelevatedProcess]::Start("C:\Users\jixxed\AppData\Local\Elite Dangerous Odyssey Materials Helper Launcher\Elite Dangerous Odyssey Materials Helper Launcher.exe", $null, "C:\Users\jixxed\AppData\Local\Elite Dangerous Odyssey Materials Helper Launcher")
 
Last edited:
A lot of people run as regular user, but when something doesn't work for whatever reason, they try to start as administrator. This can cause issues later on when running again without admin privileges. this app is intended to never be ran as admin, it does not need that kind of access to your system. When it does need it, like when registering the app for edomh:// urls, it will ask for it.

You can try this powershell script to launch an unelevated program from an elevated shell, adjust accordingly.
Code:
Add-Type @"
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

public class UnelevatedProcess {
    [DllImport("user32.dll")]
    public static extern IntPtr GetShellWindow();

    [DllImport("user32.dll", SetLastError=true)]
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    [DllImport("kernel32.dll", SetLastError=true)]
    public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);

    [DllImport("advapi32.dll", SetLastError=true)]
    public static extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, out IntPtr TokenHandle);

    [DllImport("advapi32.dll", SetLastError=true)]
    public static extern bool DuplicateTokenEx(
        IntPtr hExistingToken,
        uint dwDesiredAccess,
        IntPtr lpTokenAttributes,
        int ImpersonationLevel,
        int TokenType,
        out IntPtr phNewToken);

    [DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
    public static extern bool CreateProcessWithTokenW(
        IntPtr hToken,
        int dwLogonFlags,
        string lpApplicationName,
        string lpCommandLine,
        int dwCreationFlags,
        IntPtr lpEnvironment,
        string lpCurrentDirectory,
        ref STARTUPINFO lpStartupInfo,
        out PROCESS_INFORMATION lpProcessInformation);

    [StructLayout(LayoutKind.Sequential)]
    public struct STARTUPINFO {
        public int cb;
        public string lpReserved;
        public string lpDesktop;
        public string lpTitle;
        public int dwX;
        public int dwY;
        public int dwXSize;
        public int dwYSize;
        public int dwXCountChars;
        public int dwYCountChars;
        public int dwFillAttribute;
        public int dwFlags;
        public short wShowWindow;
        public short cbReserved2;
        public IntPtr lpReserved2;
        public IntPtr hStdInput;
        public IntPtr hStdOutput;
        public IntPtr hStdError;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct PROCESS_INFORMATION {
        public IntPtr hProcess;
        public IntPtr hThread;
        public int dwProcessId;
        public int dwThreadId;
    }

    const uint PROCESS_QUERY_INFORMATION = 0x0400;
    const uint TOKEN_DUPLICATE = 0x0002;
    const uint TOKEN_ASSIGN_PRIMARY = 0x0001;
    const uint TOKEN_QUERY = 0x0008;
    const uint TOKEN_ALL_ACCESS = 0xF01FF;
    const int SecurityImpersonation = 2;
    const int TokenPrimary = 1;

    public static bool Start(string exe, string args) {
        IntPtr hShellWnd = GetShellWindow();
        if (hShellWnd == IntPtr.Zero) return false;

        uint shellPID;
        GetWindowThreadProcessId(hShellWnd, out shellPID);

        IntPtr hShellProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, shellPID);
        if (hShellProcess == IntPtr.Zero) return false;

        IntPtr hShellToken;
        if (!OpenProcessToken(hShellProcess, TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_QUERY, out hShellToken))
            return false;

        IntPtr hUserToken;
        if (!DuplicateTokenEx(hShellToken, TOKEN_ALL_ACCESS, IntPtr.Zero, SecurityImpersonation, TokenPrimary, out hUserToken))
            return false;

        STARTUPINFO si = new STARTUPINFO();
        si.cb = Marshal.SizeOf(si);
        PROCESS_INFORMATION pi;

        bool result = CreateProcessWithTokenW(
            hUserToken, 0, exe, args, 0, IntPtr.Zero, null, ref si, out pi);

        return result;
    }
}
"@

# Example: launch EDOMH unelevated, even from elevated PowerShell
[UnelevatedProcess]::Start("C:\Users\USERNAME\AppData\Local\Elite Dangerous Odyssey Materials Helper Launcher\Elite Dangerous Odyssey Materials Helper Launcher.exe", $null)

I understand and thank you for the script, will see what I can accomplish. I truly appreciate it. =)

o7
 
I've changed and tested the script and made some adjustments to the auto updater so everything launches correctly. make sure to update the auto updater manually to 2.234
 
Hello! Portable version can not handle EDOMH links? I click "register application", it requests access to registry, i allow it, app "checking" for a second or two and then it shows, that application is unregistered.
 
Hi.

Love this app.

I'd really like the ability to create a custom wishlist using the individual materials (ie not upgrade, mod or unlock recipes) and overlay a specific colour and the context "Custom Wishlist" or some such.

Yes? No? Maybe?

Clicker
 
Last edited:
Hello! Portable version can not handle EDOMH links? I click "register application", it requests access to registry, i allow it, app "checking" for a second or two and then it shows, that application is unregistered.
there is a registry script that can add it on the discord.
 
Hi.

Love this app.

I'd really like the ability to create a custom wishlist using the individual materials (ie not upgrade, mod or unlock recipes) and overlay a specific colour and the context "Custom Wishlist" or some such.

Yes? No? Maybe?

Clicker
I believe that would be too much of a niche playstyle to support
 
@jixxed Hi Jixxed, I have one question regarding the overlay. On this screen I can see it working:
1758799351573.png


But on the Sell screen it doesn't. Any idea, why? e.g. Blur is off.
 
Hi, thank you a lot for this wonderful tool, a true masterpiece!
Its working really good, the only minor issue I have is with the Wishlist not being 100% accurate in the Materials tab.
For example, my wishlist says I need 18 Ionized Gas, but in the Materials tab, hovering over Ionized Gas, only says I need 9.
Am I doing something wrong?
Thanks in advance for the help!

1758987220220.png


1758987111127.png
 
Hi, thank you a lot for this wonderful tool, a true masterpiece!
Its working really good, the only minor issue I have is with the Wishlist not being 100% accurate in the Materials tab.
For example, my wishlist says I need 18 Ionized Gas, but in the Materials tab, hovering over Ionized Gas, only says I need 9.
Am I doing something wrong?
Thanks in advance for the help!

View attachment 440500

View attachment 440498
this bug should now be fixed
 
Back
Top Bottom