diff --git a/src/windows/wslaservice/exe/WSLASession.cpp b/src/windows/wslaservice/exe/WSLASession.cpp index 617ec40..537da56 100644 --- a/src/windows/wslaservice/exe/WSLASession.cpp +++ b/src/windows/wslaservice/exe/WSLASession.cpp @@ -13,15 +13,28 @@ Abstract: --*/ #include "WSLASession.h" +#include "WSLAUserSession.h" using wsl::windows::service::wsla::WSLASession; -WSLASession::WSLASession(const WSLA_SESSION_SETTINGS& Settings) : m_displayName(Settings.DisplayName) +WSLASession::WSLASession(const WSLA_SESSION_SETTINGS& Settings, WSLAUserSessionImpl& userSessionImpl, const VIRTUAL_MACHINE_SETTINGS& VmSettings) : + m_sessionSettings(Settings), + m_userSession(userSessionImpl), + m_virtualMachine(wil::MakeOrThrow(VmSettings, userSessionImpl.GetUserSid(), &userSessionImpl)) { + m_virtualMachine->Start(); } HRESULT WSLASession::GetDisplayName(LPWSTR* DisplayName) { - *DisplayName = wil::make_unique_string(m_displayName.c_str()).release(); + *DisplayName = wil::make_unique_string(m_sessionSettings.DisplayName).release(); return S_OK; } + +HRESULT WSLASession::GetVirtualMachine(IWSLAVirtualMachine** VirtualMachine) +{ + THROW_IF_FAILED(m_virtualMachine.CopyTo(__uuidof(IWSLAVirtualMachine), (void**)VirtualMachine)); + return S_OK; +} + + diff --git a/src/windows/wslaservice/exe/WSLASession.h b/src/windows/wslaservice/exe/WSLASession.h index 55fcbc0..603bc2f 100644 --- a/src/windows/wslaservice/exe/WSLASession.h +++ b/src/windows/wslaservice/exe/WSLASession.h @@ -15,6 +15,7 @@ Abstract: #pragma once #include "wslaservice.h" +#include "WSLAVirtualMachine.h" namespace wsl::windows::service::wsla { @@ -22,11 +23,14 @@ class DECLSPEC_UUID("4877FEFC-4977-4929-A958-9F36AA1892A4") WSLASession : public Microsoft::WRL::RuntimeClass, IWSLASession, IFastRundown> { public: - WSLASession(const WSLA_SESSION_SETTINGS& Settings); + WSLASession(const WSLA_SESSION_SETTINGS& Settings, WSLAUserSessionImpl& userSessionImpl, const VIRTUAL_MACHINE_SETTINGS& VmSettings); IFACEMETHOD(GetDisplayName)(LPWSTR* DisplayName); + IFACEMETHOD(GetVirtualMachine)(IWSLAVirtualMachine** VirtualMachine); private: - std::wstring m_displayName; + WSLA_SESSION_SETTINGS m_sessionSettings; + WSLAUserSessionImpl& m_userSession; + Microsoft::WRL::ComPtr m_virtualMachine; }; } // namespace wsl::windows::service::wsla \ No newline at end of file diff --git a/src/windows/wslaservice/exe/WSLAUserSession.cpp b/src/windows/wslaservice/exe/WSLAUserSession.cpp index d75ba00..d1c840c 100644 --- a/src/windows/wslaservice/exe/WSLAUserSession.cpp +++ b/src/windows/wslaservice/exe/WSLAUserSession.cpp @@ -64,16 +64,17 @@ PSID WSLAUserSessionImpl::GetUserSid() const return m_tokenInfo->User.Sid; } -HRESULT wsl::windows::service::wsla::WSLAUserSessionImpl::CreateSession(const WSLA_SESSION_SETTINGS* Settings, IWSLASession** Session) +HRESULT wsl::windows::service::wsla::WSLAUserSessionImpl::CreateSession( + const WSLA_SESSION_SETTINGS* Settings, const VIRTUAL_MACHINE_SETTINGS* VmSettings, IWSLASession** WslaSession) { - auto session = wil::MakeOrThrow(*Settings); + auto session = wil::MakeOrThrow(*Settings, *this, *VmSettings); { - std::lock_guard lock(m_lock); - m_sessions.emplace_back(session.Get()); + std::lock_guard lock(m_wslaSessionsLock); + m_wslaSessions.emplace_back(session.Get()); } - THROW_IF_FAILED(session.CopyTo(__uuidof(IWSLASession), (void**)Session)); + THROW_IF_FAILED(session.CopyTo(__uuidof(IWSLASession), (void**)WslaSession)); return S_OK; } @@ -102,12 +103,13 @@ try } CATCH_RETURN(); -HRESULT wsl::windows::service::wsla::WSLAUserSession::CreateSession(const WSLA_SESSION_SETTINGS* Settings, IWSLASession** Session) +HRESULT wsl::windows::service::wsla::WSLAUserSession::CreateSession( + const WSLA_SESSION_SETTINGS* Settings, const VIRTUAL_MACHINE_SETTINGS* VmSettings, IWSLASession** WslaSession) try { auto session = m_session.lock(); RETURN_HR_IF(RPC_E_DISCONNECTED, !session); - return session->CreateSession(Settings, Session); + return session->CreateSession(Settings, VmSettings, WslaSession); } CATCH_RETURN(); diff --git a/src/windows/wslaservice/exe/WSLAUserSession.h b/src/windows/wslaservice/exe/WSLAUserSession.h index 391b023..2aff97f 100644 --- a/src/windows/wslaservice/exe/WSLAUserSession.h +++ b/src/windows/wslaservice/exe/WSLAUserSession.h @@ -30,13 +30,16 @@ public: PSID GetUserSid() const; HRESULT CreateVirtualMachine(const VIRTUAL_MACHINE_SETTINGS* Settings, IWSLAVirtualMachine** VirtualMachine); - HRESULT CreateSession(const WSLA_SESSION_SETTINGS* Settings, IWSLASession** Session); + HRESULT CreateSession(const WSLA_SESSION_SETTINGS* Settings, const VIRTUAL_MACHINE_SETTINGS* VmSettings, IWSLASession** WslaSession); void OnVmTerminated(WSLAVirtualMachine* machine); private: wil::unique_tokeninfo_ptr m_tokenInfo; + std::recursive_mutex m_wslaSessionsLock; + // TODO-WSLA: Consider using a weak_ptr to easily destroy when the last client reference is released. + std::vector> m_wslaSessions; std::recursive_mutex m_lock; std::vector m_virtualMachines; @@ -54,7 +57,7 @@ public: IFACEMETHOD(GetVersion)(_Out_ WSL_VERSION* Version) override; IFACEMETHOD(CreateVirtualMachine)(const VIRTUAL_MACHINE_SETTINGS* Settings, IWSLAVirtualMachine** VirtualMachine) override; - IFACEMETHOD(CreateSession)(const WSLA_SESSION_SETTINGS* Settings, IWSLASession** Session); + IFACEMETHOD(CreateSession)(const WSLA_SESSION_SETTINGS* WslaSessionSettings, const VIRTUAL_MACHINE_SETTINGS* VmSettings, IWSLASession** WslaSession); private: std::weak_ptr m_session; diff --git a/src/windows/wslaservice/inc/wslaservice.idl b/src/windows/wslaservice/inc/wslaservice.idl index 3698719..003ea3d 100644 --- a/src/windows/wslaservice/inc/wslaservice.idl +++ b/src/windows/wslaservice/inc/wslaservice.idl @@ -117,6 +117,7 @@ struct _WSLA_SESSION_SETTINGS { interface IWSLASession : IUnknown { HRESULT GetDisplayName([out] LPWSTR* DisplayName); + HRESULT GetVirtualMachine([out] IWSLAVirtualMachine **VirtualMachine); } [ @@ -128,5 +129,5 @@ interface IWSLAUserSession : IUnknown { HRESULT GetVersion([out] WSL_VERSION* Error); HRESULT CreateVirtualMachine([in] const VIRTUAL_MACHINE_SETTINGS* Settings, [out]IWSLAVirtualMachine** VirtualMachine); - HRESULT CreateSession([in] const WSLA_SESSION_SETTINGS* Settings, [out]IWSLASession** Session); + HRESULT CreateSession([in] const WSLA_SESSION_SETTINGS* Settings, [in] const VIRTUAL_MACHINE_SETTINGS* VmSettings, [out] IWSLASession** Session); } \ No newline at end of file diff --git a/test/windows/WSLATests.cpp b/test/windows/WSLATests.cpp index 394775c..6a37f43 100644 --- a/test/windows/WSLATests.cpp +++ b/test/windows/WSLATests.cpp @@ -1116,7 +1116,15 @@ class WSLATests WSLA_SESSION_SETTINGS settings{L"my-display-name"}; wil::com_ptr session; - VERIFY_SUCCEEDED(userSession->CreateSession(&settings, &session)); + VIRTUAL_MACHINE_SETTINGS vmSettings{}; + vmSettings.BootTimeoutMs = 30 * 1000; + vmSettings.DisplayName = L"WSLA"; + vmSettings.MemoryMb = 2048; + vmSettings.CpuCount = 4; + vmSettings.NetworkingMode = WslNetworkingModeNone; + vmSettings.EnableDebugShell = true; + + VERIFY_SUCCEEDED(userSession->CreateSession(&settings, &vmSettings, &session)); wil::unique_cotaskmem_string returnedDisplayName; VERIFY_SUCCEEDED(session->GetDisplayName(&returnedDisplayName));