Condividi tramite


Creare una correzione del Package Support Framework

Se non è disponibile alcuna correzione di runtime per il problema, è possibile creare una nuova correzione di runtime scrivendo funzioni di sostituzione e includendo tutti i dati di configurazione che hanno senso. Esaminiamo ogni parte.

Funzioni di sostituzione

Identificare prima di tutto quali chiamate di funzione hanno esito negativo quando l'applicazione viene eseguita in un contenitore MSIX. Quindi, devi creare funzioni sostitutive da far chiamare dal gestore runtime. Questo offre la possibilità di sostituire l'implementazione di una funzione con un comportamento conforme alle regole dell'ambiente di runtime moderno.

Dichiarare la FIXUP_DEFINE_EXPORTS macro e quindi aggiungere un'istruzione include per l'oggetto fixup_framework.h nella parte superiore di ogni . File CPP in cui si intende aggiungere le funzioni della correzione di runtime.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Importante

Assicurarsi che la FIXUP_DEFINE_EXPORTS macro venga visualizzata prima dell'istruzione include.

Creare una funzione con la stessa firma della funzione che si vuole modificare. Ecco una funzione di esempio che sostituisce la MessageBoxW funzione .

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

La chiamata a DECLARE_FIXUP esegue il mapping della MessageBoxW funzione alla nuova funzione di sostituzione. Quando l'applicazione tenta di chiamare la MessageBoxW funzione, chiamerà invece la funzione di sostituzione.

Protezione dalle chiamate ricorsive alle funzioni nelle correzioni di runtime

Il reentrancy_guard tipo può essere aggiunto alle funzioni per proteggerli dalle chiamate di funzione ricorsive.

Ad esempio, è possibile produrre una funzione sostitutiva per la CreateFile funzione . L'implementazione potrebbe chiamare la CopyFile funzione , ma l'implementazione della CopyFile funzione potrebbe chiamare la CreateFile funzione . Ciò può portare a un ciclo ricorsivo infinito di chiamate alla CreateFile funzione.

Per altre informazioni su reentrancy_guard authoring.md

Dati di configurazione

Se si vogliono aggiungere dati di configurazione alla correzione di runtime, è consigliabile aggiungerli a config.json. In questo modo, è possibile usare per FixupQueryCurrentDllConfig analizzare facilmente i dati. Questo esempio analizza un valore booleano e stringa da tale file di configurazione.

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

Correzione dei metadati

Ogni correzione e l'applicazione Launcher PSF hanno un file di metadati XML che contiene le informazioni seguenti:

  • Versione: la versione di PSF è in MAJOR. MINORE. Formato PATCH in base alla sem versione 2.
  • Piattaforma Windows minima: versione minima di Windows necessaria per la correzione o l'utilità di avvio PSF.
  • Descrizione: breve descrizione della correzione.
  • WhenToUse: euristica su quando è necessario applicare la correzione.

Per un esempio, vedere il file di metadati FileRedirectionFixupMetadata.xml per la correzione del reindirizzamento. Lo schema dei metadati è disponibile qui.