diff --git a/Cargo.lock b/Cargo.lock index ed94ab3..09819a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -635,6 +635,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "winreg" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16cdb3898397cf7f624c294948669beafaeebc5577d5ec53d0afb76633593597" +dependencies = [ + "winapi", +] + [[package]] name = "wsld" version = "0.1.0" @@ -664,4 +673,5 @@ dependencies = [ "uuid", "widestring", "winapi", + "winreg", ] diff --git a/server/Cargo.toml b/server/Cargo.toml index 9978b10..6e46afc 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -9,6 +9,7 @@ tokio = { version = "1.7", features = ["net", "rt", "macros", "io-util", "time"] async-io = "1" once_cell = "1" winapi = { version = "0.3", features = ["wincon", "libloaderapi", "combaseapi"] } +winreg = "0.9" widestring = "0.4" serde = { version = "1.0", features = ["derive"] } serde_json = "1" diff --git a/server/src/vmcompute.rs b/server/src/vmcompute.rs index 1b3460c..243b29b 100644 --- a/server/src/vmcompute.rs +++ b/server/src/vmcompute.rs @@ -3,7 +3,7 @@ use uuid::Uuid; #[serde(rename_all = "PascalCase")] #[derive(Debug, Deserialize)] -pub struct ComputeSystem { +struct ComputeSystem { pub id: Uuid, pub system_type: String, pub owner: String, @@ -12,7 +12,7 @@ pub struct ComputeSystem { pub state: String, } -pub fn enumerate_compute_systems(query: &str) -> std::io::Result> { +fn enumerate_compute_systems(query: &str) -> std::io::Result> { use std::ffi::CString; use std::io::{Error, ErrorKind}; use widestring::WideCString; @@ -73,7 +73,8 @@ pub fn enumerate_compute_systems(query: &str) -> std::io::Result std::io::Result> { +#[allow(unused)] +fn get_wsl_vmid_by_hcs() -> std::io::Result> { let vms = enumerate_compute_systems("{}")?; for vm in vms { if vm.owner == "WSL" { @@ -82,3 +83,26 @@ pub fn get_wsl_vmid() -> std::io::Result> { } Ok(None) } + +pub fn get_wsl_vmid_by_reg() -> std::io::Result> { + let list = winreg::RegKey::predef(winreg::enums::HKEY_LOCAL_MACHINE) + .open_subkey(r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\HostComputeService\VolatileStore\ComputeSystem")?; + for k in list.enum_keys() { + let k = k?; + let subkey = list.open_subkey(&k)?; + let ty: u32 = match subkey.get_value("ComputeSystemType") { + Ok(v) => v, + Err(_) => continue, + }; + if ty == 2 { + if let Ok(v) = k.parse() { + return Ok(Some(v)); + } + } + } + Ok(None) +} + +pub fn get_wsl_vmid() -> std::io::Result> { + get_wsl_vmid_by_reg() +}