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.json
Datei 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.