reading an application's manifest file?

41,126

Solution 1

Windows manifest files are Win32 resources. In other words, they're embedded towards the end of the EXE or DLL. You can use LoadLibraryEx, FindResource, LoadResource and LockResource to load the embedded resource.

Here's a simple example that extracts its own manifest...

BOOL CALLBACK EnumResourceNameCallback(HMODULE hModule, LPCTSTR lpType,
    LPWSTR lpName, LONG_PTR lParam)
{
    HRSRC hResInfo = FindResource(hModule, lpName, lpType);
    DWORD cbResource = SizeofResource(hModule, hResInfo);

    HGLOBAL hResData = LoadResource(hModule, hResInfo);
    const BYTE *pResource = (const BYTE *)LockResource(hResData);

    TCHAR filename[MAX_PATH];
    if (IS_INTRESOURCE(lpName))
        _stprintf_s(filename, _T("#%d.manifest"), lpName);
    else
        _stprintf_s(filename, _T("%s.manifest"), lpName);

    FILE *f = _tfopen(filename, _T("wb"));
    fwrite(pResource, cbResource, 1, f);
    fclose(f);

    UnlockResource(hResData);
    FreeResource(hResData);

    return TRUE;   // Keep going
}

int _tmain(int argc, _TCHAR* argv[])
{
    const TCHAR *pszFileName = argv[0];

    HMODULE hModule = LoadLibraryEx(pszFileName, NULL, LOAD_LIBRARY_AS_DATAFILE);
    EnumResourceNames(hModule, RT_MANIFEST, EnumResourceNameCallback, NULL);
    FreeLibrary(hModule);
    return 0;
}

Alternatively, you can use MT.EXE from the Windows SDK:

>mt -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest

Solution 2

You can extract/replace/merge/validate manifests using the command line manifest tool, mt.exe, which is part of the Windows SDK:

C:\Program Files\Microsoft SDKs\Windows\v6.1>mt /?
Microsoft (R) Manifest Tool version 5.2.3790.2075
...
> To extract manifest out of a dll:
mt.exe -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest

Different locations:

  • C:\Program Files\Microsoft SDKs\Windows\v6.1\bin
  • C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86

Solution 3

Open the file in Notepad. The thing's in plain text.

Screen grab

Solution 4

There's a manifest viewer tool available here -- I don't know if the author will make source code available.

Solution 5

Resource Tuner would be nice if it supported x64 code, but as of today it's still only for 32-bit apps. Resource Hacker (the newest public beta) does support both x86 and x64 which is available from here: http://angusj.com/resourcehacker/

Share:
41,126
Brian R. Bondy
Author by

Brian R. Bondy

About me: Founder and lead developer for Brave Software, working on the Brave browser. Formerly a Khan Academy software engineer Mozillian (Mozilla contributor) C++, JavaScript, C, C#, Python, programming for > 20 years Graduate of the University of Waterloo; Married with twins boys, one singleton, and a red tri-colored border collie Past Microsoft MVP for Visual C++ Contributor to various other open source projects like WikiMedia Links: Blog/Personal website; Twitter: @brianbondy; Here is a picture of my pet unicorn:

Updated on July 09, 2022

Comments

  • Brian R. Bondy
    Brian R. Bondy almost 2 years

    Is there an easy way to read an application's already embedded manifest file?

    I was thinking along the lines of an alternate data stream?

  • Wedge
    Wedge over 14 years
    This is somewhat incorrect (the help is misleading). Typically .exes have an embedded manifest in resource #1, while .dlls have the manifest in resource #2. In any event, if you don't find a manifest resource in #1, check #2 rather than assuming it doesn't exist.
  • Roger Lipscombe
    Roger Lipscombe about 11 years
    Actually I was deliberately reading the manifest from the current application: "simple example that extracts its own manifest". Your way would work, too ;-)
  • ghord
    ghord over 8 years
    Both UnlockResource and FreeResource are obsolete.
  • Roger Lipscombe
    Roger Lipscombe over 8 years
    I've been programming Windows since 3.0; old habits die hard :)
  • don bright
    don bright over 7 years
    lol this also works in linux or bsd with the 'less' command. thanks
  • Martin Connell
    Martin Connell almost 7 years
    -out:con to output to console :)
  • StayOnTarget
    StayOnTarget almost 7 years
    This is a very helpful trick just to quickly verify what's in there. Thanks
  • mzabaluev
    mzabaluev about 4 years
    This results in an error for me with Microsoft Visual Studion 2019:mt.exe : command line error c10100a9: Some operation on the input manifests must be specified (even if it is just to pipe the input to the output)
  • mzabaluev
    mzabaluev about 4 years
    Responding to self: I ran this command line in PowerShell and it requires some escaping for the syntax used in the inputresource parameter, like so: mt.exe "-inputresource:dll_with_manifest.dll;#1" -out:extracted.manifest