mirror of
https://github.com/aphrody-labs/WSL.git
synced 2026-10-17 20:56:23 +00:00
add user token
This commit is contained in:
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(
|
||||
|
||||
Reference in new issue
Block a user