12

I'm cross compiling an application with i586-mingw32msvc under ubuntu.

I'm having difficulties understanding how to embed a manifest file to require administrator execution level with mingw32.

For my example I used this hello.c:

int main() {
    return 0;
}

this resource file hello.rc:

1 Manifest "hello.exe.manifest"

this manifest file hello.exe.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="hello" type="win32"/> 
    <description>Hello World</description> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

I compile my resource file with:

i586-mingw32msvc-windres hello.rc hello.o

I compile my final application with:

i586-mingw32msvc-gcc -O3 -Os -s -o hello.exe hello.c hello.o

SigCheck does not show the manifest file running sigcheck -m hello.exe.

Now when I run my application under Windows it does not trigger the UAC (=does not run as administrator) while when I attach the hello.exe.manifest file in the same folder it does trigger the UAC (as expected).

What did I miss?

EDIT1: Playing with Resource Hacker I've opened a Setup.exe file I've created with NSIS, the only sensible difference is that Manifest is written MANIFEST in my hello.exe and Manifest in Setup.exe though in hello.rc it's written Manifest. O_o

NSIS Installer vs hello.exe

EDIT2: I've changed the Manifest group manually with Resource Hacker:

Modified with Resource Hacker

Now hello.exe is acting normally triggering the UAC alert and running as an administrator. Seems like a "bug" with i586-mingw32msvc-windres. :-)

pr.nizar
  • 641
  • 6
  • 20
  • This may help: http://www.transmissionzero.co.uk/computing/win32-apps-with-mingw/ – Jonathon Reinhart Oct 07 '15 at 22:06
  • @JonathonReinhart Thank you but I've tried what's described on that link too.. and [the link it linked to](https://msdn.microsoft.com/en-us/library/bb756973.aspx) too.. But nothing changed.. I've updated my `hello.rc` file to `1 Manifest "hello.exe.manifest"`.. With Resource Hacker I've opened an NSIS installer (I've compiled with makensis) that requires administrator, everything is sensibly the same; the only thing that is different is the manifest field is written "Manifest" in the `Setup.exe` file and written "MANIFEST" in my `hello.exe` file! ([See here](http://i.imgur.com/WzHtXnw.png)) – pr.nizar Oct 07 '15 at 22:26
  • Normally you compile .rc file to `.res` file (not `.o`) – M.M May 21 '16 at 05:18
  • please help me, where are the imgur pictures ? – Ahmed Can Unbay Feb 21 '20 at 12:29

2 Answers2

7

With regard to the magic voodoo numbers 1 and 24:

1 24 "hello.exe.manifest"

That line translates to somthing like this:

ID_MANIFEST RT_MANIFEST "hello.exe.manifest"

where those defines are as defined as follows:

#define ID_MANIFEST 1
#ifndef RT_MANIFEST
#define RT_MANIFEST MAKEINTRESOURCE(24)
#endif

As shown above by the conditional wrappers, the RT_MANIFEST might already be defined and if you do a Google search for that RT_MANIFEST term you will find lots of hits with more details on what is going on.

jussij
  • 10,370
  • 1
  • 33
  • 49
3

With some intense voodoo I got it to work with this on my hello.rc file:

1 24 "hello.exe.manifest"

Won't even search to know what the 24 is for (resource type manifest?!).. :-)

pr.nizar
  • 641
  • 6
  • 20