Merge nucleic/olive-jade-civet-rznt into dev

This commit is contained in:
2026-07-29 00:59:16 -07:00
parent e2a1d55528
commit 80f9f3667b
2 changed files with 123 additions and 25 deletions
+25 -9
View File
@@ -37,11 +37,20 @@ dotnet run -- --session # + create a session, then a SECOND one with the
dotnet run -- --all-types # include the ABI/marshalling plumbing in the dump
```
**If it reports missing components** (`VirtualMachinePlatform`, `WslPackage`), the machine cannot
run wslc yet: `wsl --install`, reboot for the Virtual Machine Platform feature, and run again.
Everything that reaches the service fails with `REGDB_E_CLASSNOTREG` (0x80040154) until then, and
the tool says so rather than emitting a string of unexplained COM errors. `--session` is skipped
in that state instead of failing.
**If it reports missing components**, the machine cannot run wslc yet, and the two components are
NOT fixed the same way — the tool prints the specific remedy for each:
| Missing | Fix |
| --- | --- |
| `VirtualMachinePlatform` | `wsl --install`, then **reboot** (an OS optional feature). |
| `WslPackage` | `wsl --update --pre-release`, then `wsl --shutdown`. WSL is installed but older than the SDK, and **2.9.3 is pre-release-only — a plain `wsl --update` will not get there.** Confirm with `wsl --version`. |
| `SdkNeedsUpdate` | The NuGet pin is ahead of the installed service: update WSL further, or pin the package back. |
The distinction is worth knowing because the failures look alike but mean opposite things:
`REGDB_E_CLASSNOTREG` (0x80040154) is *nothing installed*, `ERROR_NOT_SUPPORTED` (0x80070032) is
*installed but too old*. The tool decodes both, along with the `WSLC_E_*` range from `wslc.idl`,
because these COM exceptions often carry an empty message and leave nothing but a hex code.
`--session` is skipped while components are missing rather than failing the same way.
Note that the assumption check reads the **`Microsoft.WSL.Containers`** namespace only. That is
correctness, not tidiness: a C#/WinRT projection also exports `ABI.Microsoft.WSL.Containers.*`
@@ -54,10 +63,17 @@ It writes the full public object model to `wslc-api-dump.txt` (`--out` to reloca
It exits 0 even when assumptions fail — a mismatch is the product, not an error. Only a genuinely
broken run (the assembly won't load) exits non-zero.
Every path in it has been exercised against a stand-in assembly carrying the observed 2.9.3 type
and member names — including the `ABI.` shadow types and a service that reports missing components
and throws `0x80040154` — so a failure on your machine is a finding about wslc, not about this
tool.
`--probe` has been **run clean on real hardware** (Windows 11 amd64, WSL 2.9.3): 54/54 `ok`,
no missing components. Every other path is exercised against a stand-in assembly carrying the
observed 2.9.3 shape — the `ABI.` shadow types, a service reporting missing components, an
`0x80070032` with an empty message, a `ServiceVersion` with no `ToString()` override, and a
duplicate-name `Session` throwing `0x80040607` — so a failure on your machine is a finding about
wslc, not about this tool.
Note the `ToString()` one, because it bit: a WinRT projection class does not override
`ToString()`, so printing a returned object gives you its *type name*. Values are rendered by
their properties instead — `ServiceVersion { Major=2, Minor=9, Revision=3 }`, not
`Microsoft.WSL.Containers.ServiceVersion`.
**What to send back:** the console output, and `wslc-api-dump.txt` if anything is MISSING —
which now means the package moved under us, not that we guessed wrong.