diff --git a/spikes/README.md b/spikes/README.md index 2874d0b..ea796bb 100644 --- a/spikes/README.md +++ b/spikes/README.md @@ -123,7 +123,12 @@ CLSID in it, so `CoCreateInstance` has nothing to name. The only registered cocl IDLs belong to the compat surface (`WSLCCompatSessionManager` and its factory) and to the WSL service proper (`LxssUserSession`, `LxssUserSessionInBox`). -The likely answer is that one of those objects also implements the internal interface — COM +**Answered on hardware (WSL 2.9.4): yes.** `WSLCCompatSessionManager` +(`a9b7a1b9-0671-405c-95f1-e0612cb4ce8f`) — the same class the SDK itself activates — answers a QI +for `IWSLCSessionManager`. One object, two faces. `IWSLCVirtualMachine` was refused by every +class, confirming §13.1's retraction against the machine rather than against an IDL. + +The hypothesis was that one of those objects also implements the internal interface — COM objects routinely expose several — so `--internal` activates each and QIs for the internal IIDs. It **never calls a method**, so a vtable mismatch cannot crash it, and QI alone answers the question. `--internal-call` then calls `GetVersion` (slot 3) and `ListSessions` to confirm the diff --git a/spikes/WslcApiDump/InternalComProbe.cs b/spikes/WslcApiDump/InternalComProbe.cs index 4ce480b..a8d9738 100644 --- a/spikes/WslcApiDump/InternalComProbe.cs +++ b/spikes/WslcApiDump/InternalComProbe.cs @@ -52,7 +52,10 @@ internal static class InternalComProbe ("IWSLCSessionManager", new Guid("82A7ABC8-6B50-43FC-AB96-15FBBE7E8760"), "THE one that matters — OpenSessionByName/EnterSession/ListSessions, i.e. reattach"), ("IWSLCSession", new Guid("EF0661E4-6364-40EA-B433-E2FDF11F3519"), - "ListContainers/OpenContainer — enumeration and the container half of reattach"), + "ListContainers/OpenContainer. EXPECTED to fail here, and its failure is not a gap: a " + + "session is RETURNED BY the manager (OpenSessionByName/EnterSession/CreateSession), " + + "not QI'd off it. Probed only to confirm the manager is a manager and not a " + + "do-everything object"), ("IWSLCVirtualMachine", new Guid("B5E2D8F1-9A3C-4E6B-8D1F-7C4A2E9B6D3A"), "GetId → the VM GUID an AF_HYPERV bind needs. Per the IDL only a factory the SYSTEM " + "service owns can produce one, so this is EXPECTED to fail — probed anyway, "