1
0
mirror of https://gitlab.com/marcandre.lureau/qemu-display.git synced 2025-04-14 08:44:46 +00:00

qemu-display: add back manual win32 mmap

It's not yet possible to map from a mapping object in memmap2...

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
Marc-André Lureau 2025-01-14 18:33:43 +04:00
parent b0fd7742e8
commit e33e057875
5 changed files with 70 additions and 18 deletions

View File

@ -269,11 +269,10 @@ impl Audio {
&p0,
)?;
self.proxy.register_out_listener(p0).await?;
let conn = zbus::connection::Builder::unix_stream(p1).p2p()
.serve_at(
"/org/qemu/Display1/AudioOutListener",
AudioOutListener { handler },
)?;
let conn = zbus::connection::Builder::unix_stream(p1).p2p().serve_at(
"/org/qemu/Display1/AudioOutListener",
AudioOutListener { handler },
)?;
#[cfg(windows)]
let conn = conn.auth_mechanism(zbus::AuthMechanism::Anonymous);
let conn = conn.build().await?;
@ -289,12 +288,10 @@ impl Audio {
&p0,
)?;
self.proxy.register_in_listener(p0).await?;
let conn = zbus::connection::Builder::unix_stream(p1)
.p2p()
.serve_at(
"/org/qemu/Display1/AudioInListener",
AudioInListener { handler },
)?;
let conn = zbus::connection::Builder::unix_stream(p1).p2p().serve_at(
"/org/qemu/Display1/AudioInListener",
AudioInListener { handler },
)?;
#[cfg(windows)]
let conn = conn.auth_mechanism(zbus::AuthMechanism::Anonymous);
let conn = conn.build().await?;

View File

@ -118,9 +118,7 @@ impl Console {
.serve_at("/org/qemu/Display1/Listener", ConsoleListener::new(handler))?;
#[cfg(windows)]
let conn = conn.auth_mechanism(zbus::AuthMechanism::Anonymous);
let conn = conn
.build()
.await?;
let conn = conn.build().await?;
*self.listener.write().unwrap() = Some(conn);
Ok(())
}

View File

@ -1,6 +1,7 @@
#[cfg(windows)]
use crate::win32::Fd;
use crate::win32::{Fd, Mmap};
use derivative::Derivative;
#[cfg(unix)]
use memmap2::Mmap;
use std::ops::Drop;
#[cfg(windows)]
@ -66,6 +67,7 @@ impl ScanoutMap {
#[cfg(windows)]
let desc = self.handle.as_raw_handle();
#[cfg(unix)]
let mmap = unsafe {
memmap2::MmapOptions::new()
.len(len)
@ -73,6 +75,13 @@ impl ScanoutMap {
.map(desc)?
};
#[cfg(windows)]
let mmap = {
use windows::Win32::Foundation::HANDLE;
let handle = HANDLE(desc as _);
Mmap::new(handle, offset.try_into().unwrap(), len)?
};
Ok(ScanoutMmap {
scanout: self,
mmap,

View File

@ -1,9 +1,13 @@
use std::io;
use tracing::warn;
use windows::Win32::{
Foundation::{CloseHandle, HANDLE},
Networking::WinSock::{WSADuplicateSocketW, SOCKET, WSAPROTOCOL_INFOW},
System::Threading::PROCESS_ACCESS_RIGHTS,
System::{
Memory::{MapViewOfFile, UnmapViewOfFile, FILE_MAP_READ, MEMORY_MAPPED_VIEW_ADDRESS},
Threading::PROCESS_ACCESS_RIGHTS,
},
};
#[cfg(feature = "qmp")]
@ -118,3 +122,49 @@ pub(crate) fn unix_stream_get_peer_pid(stream: &UnixStream) -> Result<u32, std::
Ok(ret)
}
#[derive(Debug)]
pub(crate) struct Mmap {
handle: HANDLE,
ptr: MEMORY_MAPPED_VIEW_ADDRESS,
offset: isize,
size: usize,
}
#[cfg(windows)]
impl Drop for Mmap {
fn drop(&mut self) {
unsafe {
if let Err(err) = UnmapViewOfFile(self.ptr) {
warn!("error while unmap: {}", err);
}
if let Err(err) = CloseHandle(self.handle) {
warn!("error while closing mmap: {}", err);
}
}
}
}
#[cfg(windows)]
impl Mmap {
// FIXME: remove and replace with memmap2, use offset properly
// https://github.com/RazrFalcon/memmap2-rs/issues/138
pub(crate) fn new(handle: HANDLE, offset: usize, size: usize) -> std::io::Result<Self> {
let ptr = unsafe { MapViewOfFile(handle, FILE_MAP_READ, 0, 0, offset + size) };
if ptr.Value.is_null() {
return Err(io::Error::last_os_error());
}
Ok(Self {
handle,
ptr,
offset: offset.try_into().unwrap(),
size,
})
}
pub(crate) fn as_ref(&self) -> &[u8] {
unsafe {
std::slice::from_raw_parts(self.ptr.Value.cast::<u8>().offset(self.offset), self.size)
}
}
}

View File

@ -504,12 +504,10 @@ impl ConsoleListenerMapHandler for ConsoleHandler {
#[cfg(windows)]
#[async_trait::async_trait]
impl ConsoleListenerD3d11Handler for ConsoleHandler {
#[cfg(windows)]
async fn scanout_texture2d(&mut self, scanout: qemu_display::ScanoutD3dTexture2d) {
self.send(ConsoleEvent::ScanoutD3dTexture2d(scanout));
}
#[cfg(windows)]
async fn update_texture2d(&mut self, update: qemu_display::UpdateD3dTexture2d) {
let (wait_tx, wait_rx) = futures::channel::oneshot::channel();
self.send(ConsoleEvent::UpdateD3dTexture2d { update, wait_tx });