パッケージ サポート フレームワークの修正を作成する

問題のランタイム修正がない場合は、置換関数を記述し、意味のある構成データを含めて、新しいランタイム修正を作成できます。 各部分を見てみしましょう。

置換関数

まず、MSIX コンテナーでアプリケーションを実行するときに失敗する関数呼び出しを特定します。 次に、ランタイム マネージャーで代わりに呼び出す差し替え用の関数を作成できます。 これにより、関数の実装を最新のランタイム環境の規則に準拠した動作に置き換えることができます。

マクロを FIXUP_DEFINE_EXPORTS 宣言し、各 の上部に の include fixup_framework.h ステートメントを追加します。ランタイム修正の関数を追加する予定の CPP ファイル。

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

重要

include ステートメントの FIXUP_DEFINE_EXPORTS 前にマクロが表示されます。

変更する動作を持つ関数と同じシグネチャを持つ関数を作成します。 関数を置き換える関数の例を次に示 MessageBoxW します。

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

の呼び出 DECLARE_FIXUP しによって、 MessageBoxW 関数が新しい置換関数にマップされます。 アプリケーションが関数を呼び出しようとすると MessageBoxW 、代わりに置換関数が呼び出されます。

ランタイム修正での関数の再帰呼び出しから保護する

reentrancy_guard を関数に追加して、再帰関数呼び出しから保護できます。

たとえば、 関数の置換関数を生成 CreateFile できます。 実装で 関数を呼び出す場合がありますが、関数の実装では CopyFile CopyFile 関数が呼び出される場合 CreateFile があります。 これにより、関数の呼び出しが無限に再帰される可能性 CreateFile があります。

詳細については、以下を reentrancy_guard 参照 authoring.md

構成データ

構成データをランタイム修正プログラムに追加する場合は、 への追加を検討してください config.json 。 そうすることで、 を使用して、 FixupQueryCurrentDllConfig そのデータを簡単に解析できます。 この例では、その構成ファイルからブール値と文字列値を解析します。

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

メタデータの修正

各修正プログラムと PSF 起動ツールには、次の情報を含む XML メタデータ ファイルがあります。

  • バージョン: PSF のバージョンは MAJOR です。マイナー。Sem バージョン 2 に従った PATCH 形式
  • 最小Windowsプラットフォーム: 修正プログラムまたは PSF のインストールに必要な最小起動ツール。
  • 説明: 修正プログラムの簡単な説明。
  • WhenToUse: 修正プログラムを適用する必要がある場合のヒューリスティック。

例については、リダイレクトの修正 FileRedirectionFixupMetadata.xml メタデータ ファイルを参照してください。 メタデータ スキーマは、こちらから使用 できます