web-dev-qa-db-fra.com

lire le fichier manifeste d'une application?

Existe-t-il un moyen simple de lire le fichier manifeste déjà incorporé d'une application?

Je pensais dans le sens d'un flux de données alternatif?

33
Brian R. Bondy

Les fichiers de manifeste Windows sont des ressources Win32. En d'autres termes, ils sont incorporés vers la fin de l'EXE ou de la DLL. Vous pouvez utiliser LoadLibraryEx, FindResource, LoadResource et LockResource pour charger la ressource incorporée.

Voici un exemple simple qui extrait son propre manifeste ...

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;
}

Vous pouvez également utiliser MT.EXE à partir du SDK Windows:

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

Vous pouvez extraire/remplacer/fusionner/valider des manifestes à l'aide de l'outil de manifeste de ligne de commande, mt.exe, qui fait partie du SDK de Windows:

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

EDIT: j'ai trouvé l'outil dans C:\Program Files\Microsoft SDK\Windows\v6.1\bin

26
bk1e

Ouvrez le fichier dans le Bloc-notes. La chose est en texte brut.

Screen grab

17
guest

Un outil de visualisation des manifestes est disponible ici - Je ne sais pas si l'auteur rendra le code source disponible.

9
jeffm

Resource Tuner serait bien s'il prenait en charge le code x64, mais à ce jour, il reste réservé aux applications 32 bits. Resource Hacker (la dernière version bêta publique) prend en charge les formats x86 et x64, disponibles à partir d'ici: http://angusj.com/resourcehacker/

4
Mike

Le moyen le plus simple de visualiser/modifier les manifestes dans les applications compilées est d'utiliser Resource Tuner: http://www.restuner.com/tour-manifest.htm

Dans certains cas, il est plus robuste que mt.exe de MS et constitue un outil visuel.

2
Wylder

Travaillant un peu à partir du code de Roger, voici le code que j'utilise. Il suppose que le manifeste est à l’identité n ° 1. Je suppose que c'est la valeur par défaut pour .exe. Voir le commentaire de Wedge, vous devrez peut-être également vérifier l'ID n ° 2 si vous travaillez avec une DLL.

    HMODULE module = ::LoadLibraryEx(pathname, NULL, LOAD_LIBRARY_AS_DATAFILE);
    if (module == NULL)
        return false;
    HRSRC resInfo = ::FindResource(module, MAKEINTRESOURCE(1), RT_MANIFEST); // resource id #1 should be the manifest
    if (resInfo) {
        HGLOBAL resData = ::LoadResource(module, resInfo);
        DWORD resSize = ::SizeofResource(module, resInfo);
        if (resData && resSize) {
            const char *res = (const char *)::LockResource(resData); // the manifest
            if (res) {
                // got the manifest
            }
            ::UnlockResource(resData);
        }
        ::FreeResource(resData);
    }
    ::FreeLibrary(module);
1
Samphan

Pour rappel, rappelez-vous que les manifestes peuvent également être des fichiers autonomes portant le même nom que l'application (étendue de ".manifest").

Donc, si vous voulez savoir quel manifeste est vraiment utilisé au moment de l'exécution, vous devez en tenir compte.

0
chksr

Résolvez ce problème en supprimant la licence de développeur (*_TemporaryKey.pfx) du projet ou en modifiant le nom du fichier .pfx.

0
Rahul Tripathi