Add GetDisplayName to IWSLCSession (#40860)

David Bennett committed Jun 19, 2026 at 22:25 UTC 0eded879ffce22449436fd41e02db38f69864cd0
6 files changed +27 -19
src/windows/service/inc/wslc.idl
+1
@@ -564,6 +564,7 @@ typedef struct _WSLCSessionInitSettings
564 interface IWSLCSession : IUnknown
565 {
566 HRESULT GetId([out] ULONG* Id);
567 + HRESULT GetDisplayName([out] LPWSTR* DisplayName);
568 HRESULT GetState([out] WSLCSessionState* State);
569
570 // Returns a one-off event that is signaled when the session terminates, whether due to an
src/windows/wslc/services/SessionModel.h
-11
@@ -31,19 +31,8 @@ struct Session
31 return m_session.get();
32 }
33
34 - const std::optional<std::wstring>& DisplayName() const noexcept
35 - {
36 - return m_displayName;
37 - }
38 -
39 - void SetDisplayName(std::wstring name)
40 - {
41 - m_displayName = std::move(name);
42 - }
43 -
34 private:
35 wil::com_ptr<IWSLCSession> m_session;
46 - std::optional<std::wstring> m_displayName;
36 };
37
38 } // namespace wsl::windows::wslc::models
\ No newline at end of file
src/windows/wslc/services/SessionService.cpp
+5 -8
@@ -38,12 +38,7 @@ Session SessionService::OpenSessionByName(const wil::com_ptr<IWSLCSessionManager
38 THROW_IF_FAILED(manager->OpenSessionByName(displayName, &session));
39
40 wsl::windows::common::security::ConfigureForCOMImpersonation(session.get());
41 - Session result(std::move(session));
42 - if (displayName)
43 - {
44 - result.SetDisplayName(displayName);
45 - }
46 - return result;
41 + return Session(std::move(session));
42 }
43
44 Session SessionService::OpenSession(const std::wstring& sessionName)
@@ -189,10 +184,12 @@ int SessionService::TerminateSession(const Session& session)
184 if (FAILED(hr))
185 {
186 auto errorString = wsl::windows::common::wslutil::ErrorCodeToString(hr);
192 - if (session.DisplayName().has_value())
187 +
188 + wil::unique_cotaskmem_string displayName;
189 + if (SUCCEEDED(session.Get()->GetDisplayName(&displayName)) && displayName)
190 {
191 wslutil::PrintMessage(
195 - Localization::MessageErrorCode(Localization::MessageWslcTerminateSessionFailed(session.DisplayName().value()), errorString), stderr);
192 + Localization::MessageErrorCode(Localization::MessageWslcTerminateSessionFailed(displayName.get()), errorString), stderr);
193 }
194 else
195 {
src/windows/wslcsession/WSLCSession.cpp
+11
@@ -531,6 +531,17 @@ HRESULT WSLCSession::GetId(ULONG* Id)
531 return S_OK;
532 }
533
534 +HRESULT WSLCSession::GetDisplayName(_Out_ LPWSTR* DisplayName)
535 +try
536 +{
537 + RETURN_HR_IF_NULL(E_POINTER, DisplayName);
538 + *DisplayName = nullptr;
539 +
540 + *DisplayName = wil::make_unique_string<wil::unique_cotaskmem_string>(m_displayName.c_str()).release();
541 + return S_OK;
542 +}
543 +CATCH_RETURN();
544 +
545 void WSLCSession::OnDockerdExited()
546 {
547 if (!m_sessionTerminatingEvent.is_signaled())
src/windows/wslcsession/WSLCSession.h
+1
@@ -98,6 +98,7 @@ public:
98 _In_opt_ IWarningCallback* WarningCallback) override;
99
100 IFACEMETHOD(GetId)(_Out_ ULONG* Id) override;
101 + IFACEMETHOD(GetDisplayName)(_Out_ LPWSTR* DisplayName) override;
102 IFACEMETHOD(GetState)(_Out_ WSLCSessionState* State) override;
103 IFACEMETHOD(GetTerminationEvent)(_Out_ HANDLE* Event) override;
104 IFACEMETHOD(GetTerminationReason)(_Out_ WSLCVirtualMachineTerminationReason* Reason, _Out_ LPWSTR* Details) override;
test/windows/WSLCTests.cpp
+9
@@ -409,6 +409,14 @@ class WSLCTests
409 VERIFY_ARE_EQUAL(hr, WSLC_E_SESSION_NOT_FOUND);
410 }
411
412 + WSLC_TEST_METHOD(GetDisplayNameReturnsSessionName)
413 + {
414 + wil::unique_cotaskmem_string displayName;
415 + VERIFY_SUCCEEDED(m_defaultSession->GetDisplayName(&displayName));
416 + VERIFY_IS_NOT_NULL(displayName.get());
417 + VERIFY_ARE_EQUAL(std::wstring(displayName.get()), c_testSessionName);
418 + }
419 +
420 WSLC_TEST_METHOD(CreateSessionValidation)
421 {
422 auto sessionManager = OpenSessionManager();
@@ -484,6 +492,7 @@ class WSLCTests
492
493 // The session object must reject NULL output pointers.
494 VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), m_defaultSession->GetId(nullptr));
495 + VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), m_defaultSession->GetDisplayName(nullptr));
496 VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), m_defaultSession->GetState(nullptr));
497 }
498