Créer un correctif Package Support Framework

S’il n’existe aucun correctif d’exécution pour votre problème, vous pouvez créer un correctif d’exécution en écrivant des fonctions de remplacement et en incluant toutes les données de configuration qui sont logiques. Examinons chaque partie.

Fonctions de remplacement

Tout d’abord, identifiez les appels de fonction qui échouent lorsque votre application s’exécute dans un conteneur MSIX. Ensuite, vous pouvez créer des fonctions de remplacement que vous souhaitez que le gestionnaire de runtime appellent à la place. Cela vous donne l’opportunité de remplacer l’implémentation d’une fonction par un comportement qui est conforme aux règles de l’environnement d’exécution moderne.

Déclarez la FIXUP_DEFINE_EXPORTS macro, puis ajoutez une instruction include pour le fixup_framework.h haut de chaque fichier . Fichier CPP dans lequel vous envisagez d’ajouter les fonctions de votre correctif d’exécution.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Important

Vérifiez que la FIXUP_DEFINE_EXPORTS macro s’affiche avant l’instruction Include.

Créez une fonction qui a la même signature que celle du comportement de la fonction que vous souhaitez modifier. Voici un exemple de fonction qui remplace la MessageBoxW fonction.

auto MessageBoxWImpl = &::MessageBoxW;
int WINAPI MessageBoxWFixup(
    _In_opt_ HWND hwnd,
    _In_opt_ LPCWSTR,
    _In_opt_ LPCWSTR caption,
    _In_ UINT type)
{
    return MessageBoxWImpl(hwnd, L"SUCCESS: This worked", caption, type);
}

DECLARE_FIXUP(MessageBoxWImpl, MessageBoxWFixup);

L’appel pour DECLARE_FIXUP mappe la MessageBoxW fonction à votre nouvelle fonction de remplacement. Lorsque votre application tente d’appeler la MessageBoxW fonction, elle appelle la fonction de remplacement à la place.

Protéger contre les appels récursifs aux fonctions dans les correctifs d’exécution

Le reentrancy_guard type peut être ajouté à vos fonctions pour les protéger contre les appels de fonction récursifs.

Par exemple, vous pouvez produire une fonction de remplacement pour la CreateFile fonction. Votre implémentation peut appeler la CopyFile fonction, mais l’implémentation de la CopyFile fonction peut appeler la CreateFile fonction. Cela peut entraîner un cycle récursif infini d’appels à la CreateFile fonction.

Pour plus d’informations sur authoring.md reentrancy_guard

Données de configuration

Si vous souhaitez ajouter des données de configuration à votre correctif d’exécution, envisagez de l’ajouter config.jsonau fichier . De cette façon, vous pouvez utiliser la FixupQueryCurrentDllConfig méthode pour analyser facilement ces données. Cet exemple analyse une valeur booléenne et de chaîne à partir de ce fichier de configuration.

if (auto configRoot = ::FixupQueryCurrentDllConfig())
{
    auto& config = configRoot->as_object();

    if (auto enabledValue = config.try_get("enabled"))
    {
        g_enabled = enabledValue->as_boolean().get();
    }

    if (auto logPathValue = config.try_get("logPath"))
    {
        g_logPath = logPathValue->as_string().wstring();
    }
}

Métadonnées de correction

Chaque correctif et l’application Lanceur PSF ont un fichier de métadonnées XML qui contient les informations suivantes :

  • Version : la version du PSF est en MAJOR. MINEUR. Format PATCH selon Sem Version 2.
  • Plateforme Windows minimale : version minimale requise pour la correction ou le Lanceur PSF.
  • Description : brève description du correctif.
  • WhenToUse : Heuristics on when you should apply the fixup.

Pour obtenir un exemple, consultez le fichier de métadonnées FileRedirectionFixupMetadata.xml pour la correction de redirection. Le schéma de métadonnées est disponible ici.