패키지 지원 프레임워크의 픽스업 만들기

문제에 대한 런타임 수정이 없는 경우 대체 함수를 작성하고 적합한 구성 데이터를 포함하여 새 런타임 수정을 만들 수 있습니다. 각 부분을 살펴보겠습니다.

대체 함수

먼저 애플리케이션이 MSIX 컨테이너에서 실행되면 실패하는 함수 호출을 식별합니다. 그런 다음, 런타임 관리자가 대신 호출할 대체 함수를 생성할 수 있습니다. 이를 통해 함수의 구현을 최신 런타임 환경의 규칙에 부합하는 동작으로 대체할 수 있습니다.

FIXUP_DEFINE_EXPORTS매크로를 선언한 다음 각 의 맨 위에 에 대한 include 문을 fixup_framework.h 추가합니다. 런타임 수정의 함수를 추가하려는 CPP 파일입니다.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

중요

FIXUP_DEFINE_EXPORTS매크로가 include 문 앞에 표시되는지 확인합니다.

수정하려는 동작과 동일한 시그니처가 있는 함수를 만듭니다. 다음은 함수를 대체하는 예제 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_FIXUPMessageBoxW 함수를 새 대체 함수에 매핑합니다. 애플리케이션이 함수를 호출하려고 하면 MessageBoxW 대신 대체 함수를 호출합니다.

런타임 수정에서 함수에 대한 재귀 호출로부터 보호

reentrancy_guard형식을 함수에 추가하여 재귀 함수 호출로부터 보호할 수 있습니다.

예를 들어 함수에 대한 대체 함수를 생성할 수 CreateFile 있습니다. 구현에서 함수를 호출할 수 CopyFile 있지만 함수 구현은 CopyFile 함수를 호출할 수 CreateFile 있습니다. 이로 인해 함수에 대한 호출의 무한 재귀 주기가 발생할 수 CreateFile 있습니다.

에 대한 자세한 내용은 reentrancy_guardreentrancy_guard

구성 데이터

런타임 수정에 구성 데이터를 추가하려면 에 추가하는 것이 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 버전은 주 버전입니다. 사소한. Sem 버전 2에따른 PATCH 형식입니다.
  • 최소 Windows 플랫폼: 픽스업 또는 PSF 시작 관리자 필요한 최소 Windows 버전입니다.
  • 설명: 픽스업에 대한 간단한 설명입니다.
  • WhenToUse: 픽스업을 적용해야 하는 경우에 대한 추론입니다.

예를 들어 리디렉션 수정에 대한 FileRedirectionFixupMetadata.xml 메타데이터 파일을 참조하세요. 메타데이터 스키마는 여기에서사용할 수 있습니다.