add user token

This commit is contained in:
Daman Mulye committed 2026-09-22 12:19:59 -07:00
1 parent 7c9c0db1a9
commit 2a03975edc
3 files changed
+26 -38

No files matched your search

@@ -40,6 +40,7 @@ enum class BackendKind
struct VmInstanceId
{
GUID VmId{};
wil::shared_handle UserToken{};
};
template <typename Tag>
@@ -221,9 +222,7 @@ struct VmLinuxBootRequest
std::filesystem::path KernelPath;
std::filesystem::path InitrdPath;
VmBootMethod Method = VmBootMethod::Automatic;
std::wstring GuestCommandLine;
std::wstring UserCommandLine;
std::optional<std::uint64_t> RequestedDmaBounceBufferBytes;
std::wstring KernelCommandLine;
};
enum class VmConsoleRole
@@ -334,7 +333,6 @@ struct VmEffectiveBoot
{
VmBootMethod Method = VmBootMethod::Automatic;
std::wstring KernelCommandLine;
std::optional<std::uint32_t> PageReportingOrder;
std::vector<VmConsoleRequest> Consoles;
};
@@ -390,7 +388,7 @@ struct VmNetworkAttachment
struct VmCreateRequest
{
GUID VmId{};
VmInstanceId Identity;
VmProcessorRequest Processor;
VmMemoryRequest Memory;
VmLinuxBootRequest Boot;
@@ -115,23 +115,22 @@ OpenVmmVirtualMachineBackend::GuestListener::~GuestListener() noexcept
VmDescription wsl::windows::common::vm::openvmm::ValidateCreateRequest(const VmCreateRequest& Request)
{
THROW_HR_IF(E_INVALIDARG, IsEqualGUID(Request.VmId, GUID_NULL));
THROW_HR_IF(E_INVALIDARG, IsEqualGUID(Request.Identity.VmId, GUID_NULL));
THROW_HR_IF(E_INVALIDARG, Request.Processor.Count == 0 || Request.Memory.SizeBytes == 0);
THROW_HR_IF_MSG(c_notSupported, wsl::shared::Arm64, "OpenVMM direct boot is currently supported only on x64");
validation::ValidatePath(Request.Boot.KernelPath, L"OpenVMM Kernel Path");
validation::ValidatePath(Request.Boot.InitrdPath, L"OpenVMM Initrd Path");
THROW_HR_IF(
E_INVALIDARG,
Request.Boot.GuestCommandLine.find(L'\0') != std::wstring::npos || Request.Boot.UserCommandLine.find(L'\0') != std::wstring::npos);
Request.Boot.KernelCommandLine.find(L'\0') != std::wstring::npos);
THROW_HR_IF(
E_INVALIDARG,
Request.Boot.Method != VmBootMethod::Automatic && Request.Boot.Method != VmBootMethod::LinuxDirect &&
Request.Boot.Method != VmBootMethod::Uefi);
THROW_HR_IF(c_notSupported, Request.Boot.Method == VmBootMethod::Uefi);
THROW_HR_IF(c_notSupported, Request.Boot.RequestedDmaBounceBufferBytes.has_value());
VmDescription description;
description.Identity.VmId = Request.VmId;
description.Identity = Request.Identity;
description.Backend = BackendKind::OpenVmm;
description.Processor.Count = Request.Processor.Count;
description.Memory.SizeBytes = Request.Memory.SizeBytes;
@@ -155,15 +154,7 @@ VmDescription wsl::windows::common::vm::openvmm::ValidateCreateRequest(const VmC
}
description.Boot.Method = VmBootMethod::LinuxDirect;
description.Boot.KernelCommandLine = Request.Boot.GuestCommandLine;
if (!Request.Boot.UserCommandLine.empty())
{
if (!description.Boot.KernelCommandLine.empty())
{
description.Boot.KernelCommandLine += L" ";
}
description.Boot.KernelCommandLine += Request.Boot.UserCommandLine;
}
description.Boot.KernelCommandLine = Request.Boot.KernelCommandLine;
bool serialConfigured = false;
bool virtioConfigured = false;
@@ -288,7 +279,7 @@ std::unique_ptr<OpenVmmVirtualMachineBackend> OpenVmmVirtualMachineBackend::Crea
const auto startTimeMs = GetTickCount64();
WSL_LOG(
"OpenVmmCreateVmBegin",
TraceLoggingValue(Request.VmId, "vmId"),
TraceLoggingValue(Request.Identity.VmId, "vmId"),
TraceLoggingValue(Request.Processor.Count, "processorCount"),
TraceLoggingValue(Request.Memory.SizeBytes, "memoryBytes"),
TraceLoggingValue(Request.BootDisks.size(), "bootDiskCount"),
@@ -303,7 +294,7 @@ std::unique_ptr<OpenVmmVirtualMachineBackend> OpenVmmVirtualMachineBackend::Crea
backend->Initialize(Request);
WSL_LOG(
"OpenVmmCreateVmEnd",
TraceLoggingValue(Request.VmId, "vmId"),
TraceLoggingValue(Request.Identity.VmId, "vmId"),
TraceLoggingValue(GetTickCount64() - startTimeMs, "durationMs"));
}
catch (...)
@@ -311,7 +302,7 @@ std::unique_ptr<OpenVmmVirtualMachineBackend> OpenVmmVirtualMachineBackend::Crea
const auto result = wil::ResultFromCaughtException();
WSL_LOG(
"OpenVmmCreateVmFailed",
TraceLoggingValue(Request.VmId, "vmId"),
TraceLoggingValue(Request.Identity.VmId, "vmId"),
TraceLoggingHResult(result, "result"),
TraceLoggingValue(GetTickCount64() - startTimeMs, "durationMs"));
throw;
@@ -330,7 +321,7 @@ void OpenVmmVirtualMachineBackend::Initialize(const VmCreateRequest& Request)
"openvmm.exe not found at: %ls",
executable.c_str());
auto id = wsl::shared::string::GuidToString<wchar_t>(Request.VmId, wsl::shared::string::GuidToStringFlags::None);
auto id = wsl::shared::string::GuidToString<wchar_t>(Request.Identity.VmId, wsl::shared::string::GuidToStringFlags::None);
std::erase(id, L'-');
// An exclusive directory creation prevents shortened path IDs from aliasing another VM.
m_socketDirectory = filesystem::GetTempFolderPath(GetCurrentProcessToken()) / (L"ov-" + id.substr(0, 16));
@@ -14,7 +14,7 @@ constexpr HRESULT c_notSupported = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
VmCreateRequest CreateRequest()
{
VmCreateRequest request;
THROW_IF_FAILED(CoCreateGuid(&request.VmId));
THROW_IF_FAILED(CoCreateGuid(&request.Identity.VmId));
request.Processor.Count = 2;
request.Memory.SizeBytes = 512 * c_mib;
request.Boot.KernelPath = L"C:\\images\\kernel";
@@ -28,7 +28,7 @@ VmCreateRequest CreateRunnableRequest()
const auto basePath = wsl::windows::common::wslutil::GetBasePath();
request.Boot.KernelPath = basePath / L"kernel";
request.Boot.InitrdPath = basePath / LXSS_VM_MODE_INITRD_NAME;
request.Boot.GuestCommandLine = L"panic=-1";
request.Boot.KernelCommandLine = L"panic=-1";
return request;
}
@@ -91,20 +91,19 @@ class OpenVmmVirtualMachineBackendTests
{
SKIP_TEST_ARM64();
auto request = CreateRequest();
request.Boot.GuestCommandLine = L"personality=caller console=hvc0";
request.Boot.UserCommandLine = L"console=ttyS0 custom=value";
request.Boot.KernelCommandLine = L"personality=caller console=hvc0 console=ttyS0 custom=value";
request.BootDisks.push_back(CreateDisk(L"arbitrary-key"));
request.BootDisks[0].Disk.ReadOnly = false;
const auto description = ValidateCreateRequest(request);
VERIFY_IS_TRUE(IsEqualGUID(request.VmId, description.Identity.VmId));
VERIFY_IS_TRUE(IsEqualGUID(request.Identity.VmId, description.Identity.VmId));
VERIFY_ARE_EQUAL(request.Processor.Count, description.Processor.Count);
VERIFY_ARE_EQUAL(request.Memory.SizeBytes, description.Memory.SizeBytes);
VERIFY_ARE_EQUAL(VmBootMethod::LinuxDirect, description.Boot.Method);
VERIFY_ARE_EQUAL(request.Boot.GuestCommandLine + L" " + request.Boot.UserCommandLine, description.Boot.KernelCommandLine);
VERIFY_ARE_EQUAL(request.Boot.KernelCommandLine, description.Boot.KernelCommandLine);
VERIFY_ARE_EQUAL(size_t{1}, description.BootDisks.size());
const auto& disk = description.BootDisks.at(L"arbitrary-key");
VERIFY_IS_TRUE(IsEqualGUID(request.VmId, disk.Id.Owner.VmId));
VERIFY_IS_TRUE(IsEqualGUID(request.Identity.VmId, disk.Id.Owner.VmId));
VERIFY_ARE_EQUAL(UINT64{1}, disk.Id.Value);
VERIFY_ARE_EQUAL(UINT32{0}, disk.GuestAddress.Lun);
VERIFY_IS_FALSE(disk.ReadOnly);
@@ -153,13 +152,13 @@ class OpenVmmVirtualMachineBackendTests
const auto description = ValidateCreateRequest(request);
VERIFY_ARE_EQUAL(size_t{1}, description.NetworkAdapters.size());
const auto& adapter = description.NetworkAdapters.at(L"eth0");
VERIFY_IS_TRUE(IsEqualGUID(request.VmId, adapter.Id.Owner.VmId));
VERIFY_IS_TRUE(IsEqualGUID(request.Identity.VmId, adapter.Id.Owner.VmId));
VERIFY_ARE_EQUAL(UINT64{1}, adapter.Id.Value);
VERIFY_IS_TRUE(adapter.GuestInstanceId.has_value());
VERIFY_IS_FALSE(IsEqualGUID(GUID_NULL, adapter.GuestInstanceId.value()));
VERIFY_IS_TRUE(adapter.EffectiveConfiguration.ClientMac.Bytes == request.NetworkAdapters[0].Configuration.ClientMac.Bytes);
THROW_IF_FAILED(CoCreateGuid(&request.VmId));
THROW_IF_FAILED(CoCreateGuid(&request.Identity.VmId));
const auto other = ValidateCreateRequest(request).NetworkAdapters.at(L"eth0");
VERIFY_ARE_EQUAL(adapter.Id.Value, other.Id.Value);
VERIFY_IS_FALSE(IsEqualGUID(adapter.Id.Owner.VmId, other.Id.Owner.VmId));
@@ -225,7 +224,7 @@ class OpenVmmVirtualMachineBackendTests
}
const auto first = ValidateCreateRequest(request);
VERIFY_ARE_EQUAL(UINT32{253}, first.BootDisks.at(L"253").GuestAddress.Lun);
THROW_IF_FAILED(CoCreateGuid(&request.VmId));
THROW_IF_FAILED(CoCreateGuid(&request.Identity.VmId));
const auto second = ValidateCreateRequest(request);
VERIFY_ARE_EQUAL(first.BootDisks.at(L"0").Id.Value, second.BootDisks.at(L"0").Id.Value);
VERIFY_IS_FALSE(IsEqualGUID(first.BootDisks.at(L"0").Id.Owner.VmId, second.BootDisks.at(L"0").Id.Owner.VmId));
@@ -271,9 +270,9 @@ class OpenVmmVirtualMachineBackendTests
{
SKIP_TEST_ARM64();
auto request = CreateRequest();
request.VmId = GUID_NULL;
request.Identity.VmId = GUID_NULL;
VERIFY_ARE_EQUAL(E_INVALIDARG, DescribeResult(request));
THROW_IF_FAILED(CoCreateGuid(&request.VmId));
THROW_IF_FAILED(CoCreateGuid(&request.Identity.VmId));
request.Boot.KernelPath = L"relative-kernel";
VERIFY_ARE_EQUAL(E_INVALIDARG, DescribeResult(request));
request.Boot.KernelPath = L"C:\\images\\kernel";
@@ -318,7 +317,7 @@ class OpenVmmVirtualMachineBackendTests
VERIFY_ARE_EQUAL(c_notSupported, OperationResult([&] { backend->CreateFileSystemDevice(fileSystemRequest); }));
fileSystemRequest.Transport.Layout = VmVirtioFsLayout::SingleShare;
const auto fileSystemDevice = backend->CreateFileSystemDevice(fileSystemRequest);
VERIFY_IS_TRUE(IsEqualGUID(request.VmId, fileSystemDevice.Id.Owner.VmId));
VERIFY_IS_TRUE(IsEqualGUID(request.Identity.VmId, fileSystemDevice.Id.Owner.VmId));
VERIFY_ARE_EQUAL(VmFileSystemDeviceState::Prepared, fileSystemDevice.State);
VERIFY_ARE_EQUAL(
HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS), OperationResult([&] { backend->CreateFileSystemDevice(fileSystemRequest); }));
@@ -329,7 +328,7 @@ class OpenVmmVirtualMachineBackendTests
VERIFY_ARE_EQUAL(c_notSupported, OperationResult([&] { backend->AddFileSystemShare(fileSystemDevice.Id, shareRequest); }));
shareRequest.Options.MountOptions.clear();
const auto share = backend->AddFileSystemShare(fileSystemDevice.Id, shareRequest);
VERIFY_IS_TRUE(IsEqualGUID(request.VmId, share.Id.Owner.VmId));
VERIFY_IS_TRUE(IsEqualGUID(request.Identity.VmId, share.Id.Owner.VmId));
VERIFY_ARE_EQUAL(fileSystemDevice.Id.Value, share.Device.Value);
VERIFY_ARE_EQUAL(fileSystemRequest.Transport.Tag, share.GuestAddress.Tag);
VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS), OperationResult([&] {
@@ -345,7 +344,7 @@ class OpenVmmVirtualMachineBackendTests
backend->RemoveFileSystemShare(replacementShare.Id);
const auto network = backend->GetDescription().NetworkAdapters.at(networkRequest.Tag);
VERIFY_IS_TRUE(IsEqualGUID(request.VmId, network.Id.Owner.VmId));
VERIFY_IS_TRUE(IsEqualGUID(request.Identity.VmId, network.Id.Owner.VmId));
VERIFY_IS_TRUE(network.GuestInstanceId.has_value());
VERIFY_ARE_EQUAL(networkRequest.Tag, network.Tag);
VERIFY_ARE_NOT_EQUAL(network.Id.Value, fileSystemDevice.Id.Value);
@@ -364,7 +363,7 @@ class OpenVmmVirtualMachineBackendTests
THROW_IF_FAILED(CoCreateGuid(&invalidNetwork.Owner.VmId));
VERIFY_ARE_EQUAL(E_INVALIDARG, OperationResult([&] { backend->BindPort(invalidNetwork, bindingRequest); }));
const auto binding = backend->BindPort(network.Id, bindingRequest);
VERIFY_IS_TRUE(IsEqualGUID(request.VmId, binding.Id.Owner.VmId));
VERIFY_IS_TRUE(IsEqualGUID(request.Identity.VmId, binding.Id.Owner.VmId));
VERIFY_ARE_EQUAL(network.Id.Value, binding.Device.Value);
VERIFY_ARE_EQUAL(bindingRequest.Listen.Port, binding.EffectiveListen.Port);
VERIFY_ARE_EQUAL(