From 91a8549b7075fa26241606237beaa84b1eead9a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Thu, 20 Oct 2022 12:10:10 +0400 Subject: [PATCH] Add basic windows support --- qemu-display/src/audio.rs | 10 +++++++--- qemu-display/src/console.rs | 8 ++++++-- qemu-display/src/display.rs | 26 +++++++++++++++++++++++--- qemu-display/src/util.rs | 6 ++---- qemu-display/src/win32.rs | 8 +++++--- qemu-rdw/src/main.rs | 24 +++++++++++++++++++----- 6 files changed, 62 insertions(+), 20 deletions(-) diff --git a/qemu-display/src/audio.rs b/qemu-display/src/audio.rs index 92f952b..2cd51de 100644 --- a/qemu-display/src/audio.rs +++ b/qemu-display/src/audio.rs @@ -72,6 +72,8 @@ pub struct Audio { pub proxy: AudioProxy<'static>, out_listener: Option, in_listener: Option, + #[cfg(windows)] + peer_pid: u32, } #[async_trait::async_trait] @@ -233,12 +235,14 @@ impl AudioInListener { } impl Audio { - pub async fn new(conn: &zbus::Connection) -> Result { + pub async fn new(conn: &zbus::Connection, #[cfg(windows)] peer_pid: u32) -> Result { let proxy = AudioProxy::new(conn).await?; Ok(Self { proxy, in_listener: None, out_listener: None, + #[cfg(windows)] + peer_pid, }) } @@ -246,7 +250,7 @@ impl Audio { let (p0, p1) = UnixStream::pair()?; let p0 = util::prepare_uds_pass( #[cfg(windows)] - self.proxy.inner().connection(), + self.peer_pid, &p0, )?; self.proxy.register_out_listener(p0).await?; @@ -266,7 +270,7 @@ impl Audio { let (p0, p1) = UnixStream::pair()?; let p0 = util::prepare_uds_pass( #[cfg(windows)] - self.proxy.inner().connection(), + self.peer_pid, &p0, )?; self.proxy.register_in_listener(p0).await?; diff --git a/qemu-display/src/console.rs b/qemu-display/src/console.rs index 0cea8a9..156cbb2 100644 --- a/qemu-display/src/console.rs +++ b/qemu-display/src/console.rs @@ -54,10 +54,12 @@ pub struct Console { #[derivative(Debug = "ignore")] pub mouse: MouseProxy<'static>, listener: RefCell>, + #[cfg(windows)] + peer_pid: u32, } impl Console { - pub async fn new(conn: &Connection, idx: u32) -> Result { + pub async fn new(conn: &Connection, idx: u32, #[cfg(windows)] peer_pid: u32) -> Result { let obj_path = ObjectPath::try_from(format!("/org/qemu/Display1/Console_{}", idx))?; let proxy = ConsoleProxy::builder(conn).path(&obj_path)?.build().await?; let keyboard = KeyboardProxy::builder(conn) @@ -70,6 +72,8 @@ impl Console { keyboard, mouse, listener: RefCell::new(None), + #[cfg(windows)] + peer_pid, }) } @@ -89,7 +93,7 @@ impl Console { let (p0, p1) = UnixStream::pair()?; let p0 = util::prepare_uds_pass( #[cfg(windows)] - self.proxy.inner().connection(), + self.peer_pid, &p0, )?; self.proxy.register_listener(p0).await?; diff --git a/qemu-display/src/display.rs b/qemu-display/src/display.rs index d0b6059..162a488 100644 --- a/qemu-display/src/display.rs +++ b/qemu-display/src/display.rs @@ -25,6 +25,8 @@ struct Inner<'d> { proxy: fdo::ObjectManagerProxy<'d>, conn: Connection, objects: ManagedObjects, + #[cfg(windows)] + peer_pid: u32, } #[derive(Clone)] @@ -82,7 +84,11 @@ impl<'d> Display<'d> { Ok(hm) } - pub async fn new(conn: &Connection, dest: Option) -> Result> + pub async fn new( + conn: &Connection, + dest: Option, + #[cfg(windows)] peer_pid: u32, + ) -> Result> where D: TryInto>, D::Error: Into, @@ -102,6 +108,8 @@ impl<'d> Display<'d> { proxy, conn: conn.clone(), objects, + #[cfg(windows)] + peer_pid, }; Ok(Self { @@ -113,6 +121,11 @@ impl<'d> Display<'d> { &self.inner.conn } + #[cfg(windows)] + pub fn peer_pid(&self) -> u32 { + self.inner.peer_pid + } + #[cfg(all(windows, feature = "qmp"))] pub async fn new_qmp>(path: P) -> Result> { #![allow(non_snake_case, non_camel_case_types)] @@ -163,7 +176,7 @@ impl<'d> Display<'d> { .build() .await?; - Self::new(&conn, Option::::None).await + Self::new(&conn, Option::::None, pid).await } pub async fn receive_owner_changed(&self) -> Result> { @@ -179,7 +192,14 @@ impl<'d> Display<'d> { return Ok(None); } - Ok(Some(Audio::new(&self.inner.conn).await?)) + Ok(Some( + Audio::new( + &self.inner.conn, + #[cfg(windows)] + self.peer_pid(), + ) + .await?, + )) } pub async fn clipboard(&self) -> Result> { diff --git a/qemu-display/src/util.rs b/qemu-display/src/util.rs index 2d08af1..0996b13 100644 --- a/qemu-display/src/util.rs +++ b/qemu-display/src/util.rs @@ -18,7 +18,7 @@ use windows::Win32::Networking::WinSock::SOCKET; #[cfg(windows)] use windows::Win32::System::Threading::PROCESS_DUP_HANDLE; -pub fn prepare_uds_pass(#[cfg(windows)] conn: &zbus::Connection, us: &UnixStream) -> Result { +pub fn prepare_uds_pass(#[cfg(windows)] peer_pid: u32, us: &UnixStream) -> Result { #[cfg(unix)] { Ok(us.as_raw_fd().into()) @@ -26,9 +26,7 @@ pub fn prepare_uds_pass(#[cfg(windows)] conn: &zbus::Connection, us: &UnixStream #[cfg(windows)] { - // FIXME: we should use GetConnectionCredentials to work with a bus - let pid = conn.peer_pid()?.unwrap(); - let p = win32::ProcessHandle::open(Some(pid as _), PROCESS_DUP_HANDLE)?; + let p = win32::ProcessHandle::open(Some(peer_pid as _), PROCESS_DUP_HANDLE)?; p.duplicate_socket(SOCKET(us.as_raw_socket() as _)) } } diff --git a/qemu-display/src/win32.rs b/qemu-display/src/win32.rs index 6cad574..adc8f0b 100644 --- a/qemu-display/src/win32.rs +++ b/qemu-display/src/win32.rs @@ -38,7 +38,9 @@ impl ProcessHandle { process_id: Option, desired_access: PROCESS_ACCESS_RIGHTS, ) -> Result { - use windows::Win32::System::Threading::{GetCurrentProcess, OpenProcess, PROCESS_QUERY_INFORMATION}; + use windows::Win32::System::Threading::{ + GetCurrentProcess, OpenProcess, PROCESS_QUERY_INFORMATION, + }; let process = if let Some(process_id) = process_id { let desired_access = desired_access | PROCESS_QUERY_INFORMATION; @@ -51,11 +53,11 @@ impl ProcessHandle { } pub fn process_id(&self) -> crate::Result { - use windows::Win32::System::Threading::GetProcessId; use windows::Win32::Foundation::GetLastError; + use windows::Win32::System::Threading::GetProcessId; unsafe { - let pid = GetProcessId(self.0); + let pid = GetProcessId(self.0); if pid == 0 { Err(io::Error::from_raw_os_error(GetLastError().0 as _).into()) } else { diff --git a/qemu-rdw/src/main.rs b/qemu-rdw/src/main.rs index 7db0a92..8fadd03 100644 --- a/qemu-rdw/src/main.rs +++ b/qemu-rdw/src/main.rs @@ -73,7 +73,16 @@ async fn display_from_opt(opt: Arc>) -> Option