Skip to content

[2.0-stable] Gated cherry-pick: MrmGetFilePathFromName S_OK fallback (#6603)#6612

Open
Scottj1s wants to merge 1 commit into
release/2.0-stablefrom
user/scottj1s/mrm-fallback-2.0-cp
Open

[2.0-stable] Gated cherry-pick: MrmGetFilePathFromName S_OK fallback (#6603)#6612
Scottj1s wants to merge 1 commit into
release/2.0-stablefrom
user/scottj1s/mrm-fallback-2.0-cp

Conversation

@Scottj1s

Copy link
Copy Markdown
Member

Cherry-picks #6603 into release/2.0-stable, gated behind a RuntimeCompatibilityOptions containment check so apps can disable it.

Background

MrmGetFilePathFromName is documented to always succeed and return a best-effort path even when no PRI file exists. On release/2.0-stable it fails with ERROR_FILE_NOT_FOUND, which makes new ResourceManager() throw when there is no resources.pri (the XAML-island / no-PRI scenario — original issues #5814 / #5940, fixed on main by #6603).

Containment

Because this flips an HRESULT from a failure to S_OK, the change is contained under WINAPPSDK_CHANGEID_63048673:

  • Enabled (default): MrmGetFilePathFromName returns S_OK with a non-null best-effort path (the provided filename, else resources.pri) under the base directory (if set) otherwise the module directory.
  • Disabled (via RuntimeCompatibilityOptions / WindowsAppSDKDisabledChanges): behavior reverts byte-for-byte to current release/2.0-stable (ERROR_FILE_NOT_FOUND). Both terminal search passes jump to Final, skipping the DefaultFallback pass.

The gate is placed in MrmGetFilePathFromName itself, so it contains the public export's HRESULT flip for both ResourceManager and any direct external callers.

Changes

  • MRM.cpp — gate the reachable DefaultFallback pass + S_OK return on IsChangeEnabled<WINAPPSDK_CHANGEID_63048673>(). Adds #include <FrameworkUdk/Containment.h> + an inline #define for the change ID (following the existing 62382643 precedent in Helper.cpp). Preserves the module directory since the parent-folder search mutates exeDir in place.
  • MRM.vcxproj — link the FrameworkUdk Containment worker (targets import + EnsureNuGetPackageBuildImports).
  • MrmUnitTest.vcxproj — deploy Microsoft.Internal.FrameworkUdk.dll next to the test host (mrm.dll now imports it).
  • Helper.cpp (GetDefaultPriFile) — inside the existing 62382643 block, gate the sparse-packaged [modulename].pri fallback on actual file existence (CheckFile) so it still fires once MrmGetFilePathFromName returns S_OK. Correct whether 63048673 is enabled or disabled; preserves 62382643 behavior.
  • MrmTests.cpp — strengthen GetFilePath to assert the fallback path is under the module directory.
  • BypassTests.json — remove the now-passing UnitTest::BasicTest::GetFilePath and MrtCoreUnpackagedTests.TestClass.DefaultResourceManager entries so they gate again.

Note for release engineering

Per the ContainmentV2 model this PR only defines and gates the change ID. Associating 63048673 to a release group in RuntimeCompatibilityOptions.cpp's s_catalogGroupsProd[] is the separate branch-cut step (same as the existing 62382643).

Validation

Built MrtCore.sln native projects (x64 Debug) locally; MrmUnitTest 21/21 (change enabled by default, GetFilePath returns S_OK with a valid module-dir path). Disabled-path behavior is byte-equivalent to current release/2.0-stable by construction. The Helper.cpp logic is identical to #6603, validated 27/27 (incl. DefaultResourceManager) on main.

…/2.0-stable

Cherry-picks PR #6603 into release/2.0-stable, but gates the behavior change
behind a RuntimeCompatibilityOptions containment check so apps can disable it.

MrmGetFilePathFromName is documented to always succeed and return a best-effort
path even when no PRI file exists. On 2.0-stable it fails with
ERROR_FILE_NOT_FOUND, which makes `new ResourceManager()` throw when there is no
resources.pri (the XAML-island / no-PRI scenario).

Because this changes an HRESULT from a failure to S_OK, the change is contained
under WINAPPSDK_CHANGEID_63048673:
- Enabled (default): MrmGetFilePathFromName returns S_OK with a non-null
  best-effort path (the provided filename, else resources.pri) under the base
  directory (if set) otherwise the module directory.
- Disabled (via RuntimeCompatibilityOptions): behavior reverts byte-for-byte to
  the current 2.0-stable behavior (ERROR_FILE_NOT_FOUND). Both terminal search
  passes jump to Final, skipping the DefaultFallback pass.

Changes:
- MRM.cpp: gate the reachable DefaultFallback pass + S_OK return on
  IsChangeEnabled<WINAPPSDK_CHANGEID_63048673>(). Add #include
  <FrameworkUdk/Containment.h> and an inline #define for the change ID,
  following the existing 62382643 precedent in Helper.cpp. Preserve the module
  directory since the parent-folder search mutates exeDir in place.
- MRM.vcxproj: link the FrameworkUdk Containment worker (targets import +
  EnsureNuGetPackageBuildImports).
- MrmUnitTest.vcxproj: deploy Microsoft.Internal.FrameworkUdk.dll next to the
  test host (mrm.dll now imports it).
- Helper.cpp (GetDefaultPriFile): inside the existing 62382643 block, gate the
  sparse-packaged [modulename].pri fallback on actual file existence (CheckFile)
  so it still fires once MrmGetFilePathFromName returns S_OK. Correct whether
  63048673 is enabled or disabled; preserves 62382643 behavior.
- MrmTests.cpp: strengthen GetFilePath to assert the fallback path is under the
  module directory.
- BypassTests.json: remove the now-passing UnitTest::BasicTest::GetFilePath and
  MrtCoreUnpackagedTests.TestClass.DefaultResourceManager entries so they gate.

Note for release engineering: per the ContainmentV2 model this PR only defines
and gates the change ID; associating 63048673 to a release group in
RuntimeCompatibilityOptions.cpp's s_catalogGroupsProd[] is the separate
branch-cut step.

Verified locally (x64 Debug): MrmUnitTest 21/21 (change enabled by default).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant