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