Erstellen einer Fehlerbehebung mit dem Framework zur Paketunterstützung

Wenn für Ihr Problem keine Laufzeitkorrektur vorhanden ist, können Sie eine neue Laufzeitkorrektur erstellen, indem Sie Ersetzungsfunktionen schreiben und alle Konfigurationsdaten einschließen, die sinnvoll sind. Sehen wir uns die einzelnen Teile an.

Ersetzungsfunktionen

Identifizieren Sie zunächst, welche Funktionsaufrufe fehlschlagen, wenn Ihre Anwendung in einem MSIX-Container ausgeführt wird. Anschließend können Sie Ersatzfunktionen erstellen, die der Runtime-Manager stattdessen aufrufen soll. Dadurch können Sie die Implementierung einer Funktion durch ein Verhalten ersetzen, das den Regeln der modernen Laufzeitumgebung entspricht.

Deklarieren Sie das FIXUP_DEFINE_EXPORTS Makro, und fügen Sie dann eine Include-Anweisung für den fixup_framework.h oberen Rand der einzelnen Elemente hinzu. CPP-Datei, in der Sie die Funktionen Ihres Laufzeitfixes hinzufügen möchten.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Wichtig

Stellen Sie sicher, dass das FIXUP_DEFINE_EXPORTS Makro vor der include-Anweisung angezeigt wird.

Erstellen Sie eine Funktion, die dieselbe Signatur der Funktion aufweist, die das Verhalten aufweist, das Sie ändern möchten. Hier ist eine Beispielfunktion, die die MessageBoxW Funktion ersetzt.

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

Der Aufruf, um DECLARE_FIXUP die MessageBoxW Funktion Ihrer neuen Ersetzungsfunktion zuordnet. Wenn Ihre Anwendung versucht, die MessageBoxW Funktion aufzurufen, ruft sie stattdessen die Ersetzungsfunktion auf.

Schutz vor rekursiven Aufrufen von Funktionen in Laufzeitfixes

Der reentrancy_guard Typ kann Ihren Funktionen hinzugefügt werden, um sie vor rekursiven Funktionsaufrufen zu schützen.

Sie können z. B. eine Ersatzfunktion für die CreateFile Funktion erzeugen. Ihre Implementierung ruft die CopyFile Funktion möglicherweise auf, aber die Implementierung der CopyFile Funktion kann die CreateFile Funktion aufrufen. Dies kann zu einem unendlichen rekursiven Zyklus von Aufrufen der CreateFile Funktion führen.

Weitere Informationen finden reentrancy_guard Sie unter authoring.md

Konfigurationsdaten

Wenn Sie Ihrem Laufzeit-Fix Konfigurationsdaten hinzufügen möchten, sollten Sie es der config.jsonDatei hinzufügen. Auf diese Weise können Sie diese FixupQueryCurrentDllConfig Daten einfach analysieren. In diesem Beispiel wird ein boolescher Wert und ein Zeichenfolgenwert aus dieser Konfigurationsdatei analysiert.

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

Beheben von Metadaten

Jedes Fixup und die PSF-Startprogramm-Anwendung verfügt über eine XML-Metadatendatei, die die folgenden Informationen enthält:

  • Version: Die Version der PSF ist in MAJOR. KLEINER. PATCH-Format gemäß Sem Version 2.
  • Minimale Windows-Plattform: Die mindeste Windows-Version, die für die Fixup- oder PSF-Startprogramm erforderlich ist.
  • Beschreibung: Eine kurze Beschreibung des Fixups.
  • WhenToUse: Heuristics on when you should apply the fixup.

Ein Beispiel finden Sie in der Metadatendatei FileRedirectionFixupMetadata.xml für die Umleitungskorrektur. Das Metadatenschema ist hier verfügbar.