From 05537ab6645a87fa635ba42b3021982515801785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Sun, 19 Jan 2025 16:27:56 +0100 Subject: [PATCH 1/7] Change implementation to avoid lifetime and convert sys pointer to higher level pointer using memory transparency --- .../src/generator/c_funcs_tokens.rs | 22 ++++---- wslplugins-rs/src/api/api_v1.rs | 24 ++++++-- wslplugins-rs/src/distribution_information.rs | 51 +++++++++++------ .../src/offline_distribution_information.rs | 56 ++++++++++++------- wslplugins-rs/src/plugin/utils.rs | 4 +- wslplugins-rs/src/utils.rs | 6 ++ wslplugins-rs/src/wsl_context.rs | 4 +- wslplugins-rs/src/wsl_session_information.rs | 47 +++++++++++++--- wslplugins-rs/src/wsl_vm_creation_settings.rs | 41 +++++++++----- 9 files changed, 175 insertions(+), 80 deletions(-) diff --git a/wslplugins-macro-core/src/generator/c_funcs_tokens.rs b/wslplugins-macro-core/src/generator/c_funcs_tokens.rs index 11a3624..8f97230 100644 --- a/wslplugins-macro-core/src/generator/c_funcs_tokens.rs +++ b/wslplugins-macro-core/src/generator/c_funcs_tokens.rs @@ -18,8 +18,8 @@ pub(super) fn get_c_func_tokens(hook: Hooks) -> Result> { let settings_ptr = unsafe { &*settings }; if let Some(plugin) = PLUGIN.get() { let result = plugin.#trait_method_ident( - &::wslplugins_rs::WSLSessionInformation::from(session_ptr), - &::wslplugins_rs::WSLVmCreationSettings::from(settings_ptr), + session_ptr.as_ref(), + settings_ptr.as_ref(), ); ::wslplugins_rs::plugin::utils::consume_to_win_result(result).into() } else { @@ -33,7 +33,7 @@ pub(super) fn get_c_func_tokens(hook: Hooks) -> Result> { ) -> ::windows::core::HRESULT { let session_ptr = unsafe { &*session }; if let Some(plugin) = PLUGIN.get() { - plugin.#trait_method_ident(&::wslplugins_rs::WSLSessionInformation::from(session_ptr)).into() + plugin.#trait_method_ident(session_ptr.as_ref()).into() } else { ::windows::Win32::Foundation::E_FAIL } @@ -48,8 +48,8 @@ pub(super) fn get_c_func_tokens(hook: Hooks) -> Result> { let distribution_ptr = unsafe { &*distribution }; if let Some(plugin) = PLUGIN.get() { let result = plugin.#trait_method_ident( - &::wslplugins_rs::WSLSessionInformation::from(session_ptr), - &::wslplugins_rs::DistributionInformation::from(distribution_ptr), + session_ptr.as_ref(), + distribution_ptr.as_ref(), ); ::wslplugins_rs::plugin::utils::consume_to_win_result(result).into() } else { @@ -66,8 +66,8 @@ pub(super) fn get_c_func_tokens(hook: Hooks) -> Result> { let distribution_ptr = unsafe { &*distribution }; if let Some(plugin) = PLUGIN.get() { plugin.#trait_method_ident( - &::wslplugins_rs::WSLSessionInformation::from(session_ptr), - &::wslplugins_rs::DistributionInformation::from(distribution_ptr), + session_ptr.as_ref(), + distribution_ptr.as_ref(), ).into() } else { ::windows::Win32::Foundation::E_FAIL @@ -83,8 +83,8 @@ pub(super) fn get_c_func_tokens(hook: Hooks) -> Result> { let distribution_ptr = unsafe { &*distribution }; if let Some(plugin) = PLUGIN.get() { plugin.#trait_method_ident( - &::wslplugins_rs::WSLSessionInformation::from(session_ptr), - &::wslplugins_rs::OfflineDistributionInformation::from(distribution_ptr), + session_ptr.as_ref(), + distribution_ptr.as_ref(), ).into() } else { ::windows::Win32::Foundation::E_FAIL @@ -100,8 +100,8 @@ pub(super) fn get_c_func_tokens(hook: Hooks) -> Result> { let distribution_ptr = unsafe { &*distribution }; if let Some(plugin) = PLUGIN.get() { plugin.#trait_method_ident( - &::wslplugins_rs::WSLSessionInformation::from(session_ptr), - &::wslplugins_rs::OfflineDistributionInformation::from(distribution_ptr), + session_ptr.as_ref(), + distribution_ptr.as_ref(), ).into() } else { ::windows::Win32::Foundation::E_FAIL diff --git a/wslplugins-rs/src/api/api_v1.rs b/wslplugins-rs/src/api/api_v1.rs index dc5a568..3312357 100644 --- a/wslplugins-rs/src/api/api_v1.rs +++ b/wslplugins-rs/src/api/api_v1.rs @@ -30,16 +30,17 @@ use super::utils::check_required_version_result; /// Represents a structured interface for interacting with the WSLPluginAPIV1 API. /// This struct encapsulates the methods provided by the WSLPluginAPIV1 API, allowing /// idiomatic interaction with the Windows Subsystem for Linux (WSL). -pub struct ApiV1<'a>(&'a WSLPluginAPIV1); +#[repr(transparent)] +pub struct ApiV1(WSLPluginAPIV1); /// Converts a raw reference to `WSLPluginAPIV1` into [ApiV1]. -impl<'a> From<&'a WSLPluginAPIV1> for ApiV1<'a> { - fn from(value: &'a WSLPluginAPIV1) -> Self { - Self(value) +impl From<&WSLPluginAPIV1> for &ApiV1 { + fn from(internal: &WSLPluginAPIV1) -> Self { + unsafe { &*(internal as *const WSLPluginAPIV1 as *const ApiV1) } } } -impl ApiV1<'_> { +impl ApiV1 { /// Returns the current version of the WSL API being used. /// /// This is useful for checking compatibility with specific API features. @@ -252,10 +253,21 @@ impl ApiV1<'_> { } } -impl Debug for ApiV1<'_> { +impl Debug for ApiV1 { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("ApiV1") .field("version", self.version()) .finish() } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_transparence; + + #[test] + fn test_layouts() { + test_transparence::(); + } +} diff --git a/wslplugins-rs/src/distribution_information.rs b/wslplugins-rs/src/distribution_information.rs index 281d306..41f4048 100644 --- a/wslplugins-rs/src/distribution_information.rs +++ b/wslplugins-rs/src/distribution_information.rs @@ -31,22 +31,28 @@ use wslplugins_sys::WSLVersion; /// /// This struct wraps the `WSLDistributionInformation` from the WSL Plugin API and provides /// safe, idiomatic Rust access to its fields. -pub struct DistributionInformation<'a>(&'a wslplugins_sys::WSLDistributionInformation); +#[repr(transparent)] +pub struct DistributionInformation(wslplugins_sys::WSLDistributionInformation); -impl<'a> From<&'a wslplugins_sys::WSLDistributionInformation> for DistributionInformation<'a> { - /// Creates a `DistributionInformation` instance from a reference to the raw WSL Plugin API structure. - /// - /// # Arguments - /// - `ptr`: A reference to a `WSLDistributionInformation` instance. - /// - /// # Returns - /// A wrapped `DistributionInformation` instance. - fn from(ptr: &'a wslplugins_sys::WSLDistributionInformation) -> Self { - Self(ptr) +impl AsRef for wslplugins_sys::WSLDistributionInformation { + fn as_ref(&self) -> &DistributionInformation { + unsafe { + &*(self as *const wslplugins_sys::WSLDistributionInformation + as *const DistributionInformation) + } + } +} + +impl AsRef for DistributionInformation { + fn as_ref(&self) -> &wslplugins_sys::WSLDistributionInformation { + unsafe { + &*(self as *const DistributionInformation + as *const wslplugins_sys::WSLDistributionInformation) + } } } -impl DistributionInformation<'_> { +impl DistributionInformation { /// Retrieves the PID of the init process. /// /// This requires API version 2.0.5 or higher. If the current API version does not meet @@ -74,7 +80,7 @@ impl DistributionInformation<'_> { } } -impl CoreDistributionInformation for DistributionInformation<'_> { +impl CoreDistributionInformation for DistributionInformation { /// Retrieves the unique ID of the distribution. /// /// # Returns @@ -108,7 +114,7 @@ impl CoreDistributionInformation for DistributionInformation<'_> { } } -impl PartialEq for DistributionInformation<'_> +impl PartialEq for DistributionInformation where T: CoreDistributionInformation, { @@ -118,14 +124,14 @@ where } } -impl Hash for DistributionInformation<'_> { +impl Hash for DistributionInformation { /// Computes a hash based on the distribution's ID. fn hash(&self, state: &mut H) { self.id().hash(state); } } -impl Display for DistributionInformation<'_> { +impl Display for DistributionInformation { /// Formats the distribution information for display. /// /// The output includes the distribution's name and ID. @@ -134,7 +140,7 @@ impl Display for DistributionInformation<'_> { } } -impl Debug for DistributionInformation<'_> { +impl Debug for DistributionInformation { /// Formats the distribution information for debugging. /// /// The output includes: @@ -156,3 +162,14 @@ impl Debug for DistributionInformation<'_> { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_transparence; + + #[test] + fn test_layouts() { + test_transparence::(); + } +} diff --git a/wslplugins-rs/src/offline_distribution_information.rs b/wslplugins-rs/src/offline_distribution_information.rs index d3cde04..b2b68ed 100644 --- a/wslplugins-rs/src/offline_distribution_information.rs +++ b/wslplugins-rs/src/offline_distribution_information.rs @@ -17,27 +17,27 @@ use windows::core::GUID; /// /// This struct allows access to the details of an offline WSL distribution, including /// its ID, name, and optional package family name. -/// -/// # Lifetime Parameters -/// - `'a`: The lifetime of the referenced `WslOfflineDistributionInformation` instance. -pub struct OfflineDistributionInformation<'a>( - &'a wslplugins_sys::WslOfflineDistributionInformation, -); +#[repr(transparent)] +pub struct OfflineDistributionInformation(wslplugins_sys::WslOfflineDistributionInformation); +impl AsRef for OfflineDistributionInformation { + fn as_ref(&self) -> &wslplugins_sys::WslOfflineDistributionInformation { + unsafe { + &*(self as *const OfflineDistributionInformation + as *const wslplugins_sys::WslOfflineDistributionInformation) + } + } +} -impl<'a> OfflineDistributionInformation<'a> { - /// Creates a new `OfflineDistributionInformation` instance from a raw pointer. - /// - /// # Arguments - /// - `ptr`: A reference to a `WslOfflineDistributionInformation` instance. - /// - /// # Returns - /// A safe wrapper around the provided pointer. - pub fn from(ptr: &'a wslplugins_sys::WslOfflineDistributionInformation) -> Self { - Self(ptr) +impl AsRef for wslplugins_sys::WslOfflineDistributionInformation { + fn as_ref(&self) -> &OfflineDistributionInformation { + unsafe { + &*(self as *const wslplugins_sys::WslOfflineDistributionInformation + as *const OfflineDistributionInformation) + } } } -impl CoreDistributionInformation for OfflineDistributionInformation<'_> { +impl CoreDistributionInformation for OfflineDistributionInformation { /// Retrieves the [GUID] of the offline distribution. fn id(&self) -> GUID { self.0.Id @@ -65,7 +65,7 @@ impl CoreDistributionInformation for OfflineDistributionInformation<'_> { } } -impl PartialEq for OfflineDistributionInformation<'_> +impl PartialEq for OfflineDistributionInformation where T: CoreDistributionInformation, { @@ -75,14 +75,14 @@ where } } -impl Hash for OfflineDistributionInformation<'_> { +impl Hash for OfflineDistributionInformation { /// Computes a hash based on the distribution's ID. fn hash(&self, state: &mut H) { self.id().hash(state); } } -impl Display for OfflineDistributionInformation<'_> { +impl Display for OfflineDistributionInformation { /// Formats the offline distribution information for display. /// /// The output includes the distribution's name and ID. @@ -91,7 +91,7 @@ impl Display for OfflineDistributionInformation<'_> { } } -impl Debug for OfflineDistributionInformation<'_> { +impl Debug for OfflineDistributionInformation { /// Formats the offline distribution information for debugging. /// /// The output includes the distribution's name, ID, and package family name. @@ -103,3 +103,17 @@ impl Debug for OfflineDistributionInformation<'_> { .finish() } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_transparence; + + #[test] + fn test_layouts() { + test_transparence::< + wslplugins_sys::WslOfflineDistributionInformation, + OfflineDistributionInformation, + >(); + } +} diff --git a/wslplugins-rs/src/plugin/utils.rs b/wslplugins-rs/src/plugin/utils.rs index 3e9257a..ec5b357 100644 --- a/wslplugins-rs/src/plugin/utils.rs +++ b/wslplugins-rs/src/plugin/utils.rs @@ -9,7 +9,7 @@ use windows::{ }; use wslplugins_sys::WSLPluginAPIV1; -use crate::{api::ApiV1, WSLContext}; +use crate::WSLContext; #[cfg(doc)] use super::Error; @@ -50,7 +50,7 @@ pub fn create_plugin_with_required_version( wslplugins_sys::require_version(required_major, required_minor, required_revision, api) .ok()?; } - if let Some(context) = WSLContext::init(ApiV1::from(api)) { + if let Some(context) = WSLContext::init(api.into()) { let plugin = T::try_new(context)?; Ok(plugin) } else { diff --git a/wslplugins-rs/src/utils.rs b/wslplugins-rs/src/utils.rs index 5a4572b..ac63a22 100644 --- a/wslplugins-rs/src/utils.rs +++ b/wslplugins-rs/src/utils.rs @@ -58,3 +58,9 @@ mod tests { assert_eq!(cstring.into_bytes(), expected); } } + +#[cfg(test)] +pub(crate) fn test_transparence() { + assert_eq!(align_of::(), align_of::()); + assert_eq!(size_of::(), size_of::()); +} diff --git a/wslplugins-rs/src/wsl_context.rs b/wslplugins-rs/src/wsl_context.rs index f908a38..6880da4 100644 --- a/wslplugins-rs/src/wsl_context.rs +++ b/wslplugins-rs/src/wsl_context.rs @@ -16,7 +16,7 @@ static CURRENT_CONTEXT: OnceLock = OnceLock::new(); /// throughout the plugin's lifecycle. pub struct WSLContext { /// The API interface used for interacting with the WSL plugin API. - pub api: ApiV1<'static>, + pub api: &'static ApiV1, } impl WSLContext { @@ -59,7 +59,7 @@ impl WSLContext { /// # Returns /// - `Some(&'static WSLContext)`: If the context was successfully initialized. /// - `None`: If the context has already been initialized. - pub fn init(api: ApiV1<'static>) -> Option<&'static Self> { + pub fn init(api: &'static ApiV1) -> Option<&'static Self> { CURRENT_CONTEXT.set(WSLContext { api }).ok()?; CURRENT_CONTEXT.get() } diff --git a/wslplugins-rs/src/wsl_session_information.rs b/wslplugins-rs/src/wsl_session_information.rs index 654bde5..cdd4838 100644 --- a/wslplugins-rs/src/wsl_session_information.rs +++ b/wslplugins-rs/src/wsl_session_information.rs @@ -16,9 +16,9 @@ use windows::Win32::Security::PSID; /// /// # Lifetime Parameters /// - `'a`: The lifetime of the referenced `WSLSessionInformation` instance. -pub struct WSLSessionInformation<'a>(&'a wslplugins_sys::WSLSessionInformation); +pub struct WSLSessionInformation(wslplugins_sys::WSLSessionInformation); -impl WSLSessionInformation<'_> { +impl WSLSessionInformation { /// Retrieves the session ID. /// /// # Returns @@ -44,7 +44,7 @@ impl WSLSessionInformation<'_> { } } -impl<'a> From<&'a wslplugins_sys::WSLSessionInformation> for WSLSessionInformation<'a> { +impl From<&wslplugins_sys::WSLSessionInformation> for &WSLSessionInformation { /// Creates a `WSLSessionInformation` instance from a reference to `WSLSessionInformation` from the API. /// /// # Arguments @@ -52,12 +52,31 @@ impl<'a> From<&'a wslplugins_sys::WSLSessionInformation> for WSLSessionInformati /// /// # Returns /// A safe wrapper around the provided pointer. - fn from(ptr: &'a wslplugins_sys::WSLSessionInformation) -> Self { - Self(ptr) + fn from(internal: &wslplugins_sys::WSLSessionInformation) -> Self { + unsafe { + &*(internal as *const wslplugins_sys::WSLSessionInformation + as *const WSLSessionInformation) + } } } -impl hash::Hash for WSLSessionInformation<'_> { +impl AsRef for wslplugins_sys::WSLSessionInformation { + fn as_ref(&self) -> &WSLSessionInformation { + unsafe { + &*(self as *const wslplugins_sys::WSLSessionInformation as *const WSLSessionInformation) + } + } +} + +impl AsRef for WSLSessionInformation { + fn as_ref(&self) -> &wslplugins_sys::WSLSessionInformation { + unsafe { + &*(self as *const WSLSessionInformation as *const wslplugins_sys::WSLSessionInformation) + } + } +} + +impl hash::Hash for WSLSessionInformation { /// Computes a hash based on the session ID. /// /// # Arguments @@ -67,7 +86,7 @@ impl hash::Hash for WSLSessionInformation<'_> { } } -impl PartialEq for WSLSessionInformation<'_> { +impl PartialEq for WSLSessionInformation { /// Compares two `WSLSessionInformation` instances for equality based on their session IDs. /// /// # Arguments @@ -81,7 +100,7 @@ impl PartialEq for WSLSessionInformation<'_> { } // Manually implements Debug for `WSLSessionInformation`. -impl fmt::Debug for WSLSessionInformation<'_> { +impl fmt::Debug for WSLSessionInformation { /// Formats the session information for debugging. /// /// The output includes the session ID, user token, and user SID. @@ -93,3 +112,15 @@ impl fmt::Debug for WSLSessionInformation<'_> { .finish() } } + +#[cfg(test)] +mod tests { + use crate::utils::test_transparence; + + use super::WSLSessionInformation; + + #[test] + fn test_layouts() { + test_transparence::(); + } +} diff --git a/wslplugins-rs/src/wsl_vm_creation_settings.rs b/wslplugins-rs/src/wsl_vm_creation_settings.rs index 34c080b..0f4d0bb 100644 --- a/wslplugins-rs/src/wsl_vm_creation_settings.rs +++ b/wslplugins-rs/src/wsl_vm_creation_settings.rs @@ -15,22 +15,25 @@ use crate::WSLUserConfiguration; /// /// # Lifetime Parameters /// - `'a`: The lifetime of the referenced `WSLVmCreationSettings` instance. -pub struct WSLVmCreationSettings<'a>(&'a wslplugins_sys::WSLVmCreationSettings); +pub struct WSLVmCreationSettings(wslplugins_sys::WSLVmCreationSettings); -impl<'a> From<&'a wslplugins_sys::WSLVmCreationSettings> for WSLVmCreationSettings<'a> { - /// Creates a `WSLVmCreationSettings` instance from a reference to the raw WSL Plugin API structure. - /// - /// # Arguments - /// - `value`: A reference to a `WSLVmCreationSettings` instance from the WSL Plugin API. - /// - /// # Returns - /// A wrapped `WSLVmCreationSettings` instance. - fn from(value: &'a wslplugins_sys::WSLVmCreationSettings) -> Self { - WSLVmCreationSettings(value) +impl AsRef for WSLVmCreationSettings { + fn as_ref(&self) -> &wslplugins_sys::WSLVmCreationSettings { + unsafe { + &*(self as *const WSLVmCreationSettings as *const wslplugins_sys::WSLVmCreationSettings) + } + } +} + +impl AsRef for wslplugins_sys::WSLVmCreationSettings { + fn as_ref(&self) -> &WSLVmCreationSettings { + unsafe { + &*(self as *const wslplugins_sys::WSLVmCreationSettings as *const WSLVmCreationSettings) + } } } -impl WSLVmCreationSettings<'_> { +impl WSLVmCreationSettings { /// Retrieves the custom configuration flags for the VM. /// /// # Returns @@ -45,7 +48,7 @@ impl WSLVmCreationSettings<'_> { } } -impl Debug for WSLVmCreationSettings<'_> { +impl Debug for WSLVmCreationSettings { /// Formats the VM creation settings for debugging. /// /// The debug output includes the custom configuration flags. @@ -58,3 +61,15 @@ impl Debug for WSLVmCreationSettings<'_> { .finish() } } + +#[cfg(test)] +mod tests { + use crate::utils::test_transparence; + + use super::WSLVmCreationSettings; + + #[test] + fn test_layouts() { + test_transparence::(); + } +} From 917b33dc2b4347978cfa1acd3c802917dcc22b4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Sun, 19 Jan 2025 16:34:45 +0100 Subject: [PATCH 2/7] Fix item after test module --- wslplugins-rs/src/utils.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/wslplugins-rs/src/utils.rs b/wslplugins-rs/src/utils.rs index ac63a22..96ffa4a 100644 --- a/wslplugins-rs/src/utils.rs +++ b/wslplugins-rs/src/utils.rs @@ -20,6 +20,12 @@ pub fn cstring_from_str(input: &str) -> CString { unsafe { CString::from_vec_unchecked(filtered_input) } } +#[cfg(test)] +pub(crate) fn test_transparence() { + assert_eq!(align_of::(), align_of::()); + assert_eq!(size_of::(), size_of::()); +} + #[cfg(test)] mod tests { use super::*; @@ -58,9 +64,3 @@ mod tests { assert_eq!(cstring.into_bytes(), expected); } } - -#[cfg(test)] -pub(crate) fn test_transparence() { - assert_eq!(align_of::(), align_of::()); - assert_eq!(size_of::(), size_of::()); -} From 5fb1d4bfdff309acf42a955c6bb3ef9f8c55712e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Sun, 19 Jan 2025 17:18:08 +0100 Subject: [PATCH 3/7] Simplify as_ref --- wslplugins-rs/src/distribution_information.rs | 5 +---- wslplugins-rs/src/offline_distribution_information.rs | 5 +---- wslplugins-rs/src/wsl_session_information.rs | 4 +--- wslplugins-rs/src/wsl_vm_creation_settings.rs | 4 +--- 4 files changed, 4 insertions(+), 14 deletions(-) diff --git a/wslplugins-rs/src/distribution_information.rs b/wslplugins-rs/src/distribution_information.rs index 41f4048..4e923b3 100644 --- a/wslplugins-rs/src/distribution_information.rs +++ b/wslplugins-rs/src/distribution_information.rs @@ -45,10 +45,7 @@ impl AsRef for wslplugins_sys::WSLDistributionInformati impl AsRef for DistributionInformation { fn as_ref(&self) -> &wslplugins_sys::WSLDistributionInformation { - unsafe { - &*(self as *const DistributionInformation - as *const wslplugins_sys::WSLDistributionInformation) - } + &self.0 } } diff --git a/wslplugins-rs/src/offline_distribution_information.rs b/wslplugins-rs/src/offline_distribution_information.rs index b2b68ed..60bc694 100644 --- a/wslplugins-rs/src/offline_distribution_information.rs +++ b/wslplugins-rs/src/offline_distribution_information.rs @@ -21,10 +21,7 @@ use windows::core::GUID; pub struct OfflineDistributionInformation(wslplugins_sys::WslOfflineDistributionInformation); impl AsRef for OfflineDistributionInformation { fn as_ref(&self) -> &wslplugins_sys::WslOfflineDistributionInformation { - unsafe { - &*(self as *const OfflineDistributionInformation - as *const wslplugins_sys::WslOfflineDistributionInformation) - } + &self.0 } } diff --git a/wslplugins-rs/src/wsl_session_information.rs b/wslplugins-rs/src/wsl_session_information.rs index cdd4838..b9e7e4a 100644 --- a/wslplugins-rs/src/wsl_session_information.rs +++ b/wslplugins-rs/src/wsl_session_information.rs @@ -70,9 +70,7 @@ impl AsRef for wslplugins_sys::WSLSessionInformation { impl AsRef for WSLSessionInformation { fn as_ref(&self) -> &wslplugins_sys::WSLSessionInformation { - unsafe { - &*(self as *const WSLSessionInformation as *const wslplugins_sys::WSLSessionInformation) - } + &self.0 } } diff --git a/wslplugins-rs/src/wsl_vm_creation_settings.rs b/wslplugins-rs/src/wsl_vm_creation_settings.rs index 0f4d0bb..976e0ff 100644 --- a/wslplugins-rs/src/wsl_vm_creation_settings.rs +++ b/wslplugins-rs/src/wsl_vm_creation_settings.rs @@ -19,9 +19,7 @@ pub struct WSLVmCreationSettings(wslplugins_sys::WSLVmCreationSettings); impl AsRef for WSLVmCreationSettings { fn as_ref(&self) -> &wslplugins_sys::WSLVmCreationSettings { - unsafe { - &*(self as *const WSLVmCreationSettings as *const wslplugins_sys::WSLVmCreationSettings) - } + &self.0 } } From bcaf123f1923ec9e5e311d4abfa07a43c8efb944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Sun, 19 Jan 2025 17:24:08 +0100 Subject: [PATCH 4/7] Fix ApiV1 --- wslplugins-rs/src/api/api_v1.rs | 13 +++++++++---- wslplugins-rs/src/plugin/utils.rs | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/wslplugins-rs/src/api/api_v1.rs b/wslplugins-rs/src/api/api_v1.rs index 3312357..d4df5f2 100644 --- a/wslplugins-rs/src/api/api_v1.rs +++ b/wslplugins-rs/src/api/api_v1.rs @@ -33,10 +33,15 @@ use super::utils::check_required_version_result; #[repr(transparent)] pub struct ApiV1(WSLPluginAPIV1); -/// Converts a raw reference to `WSLPluginAPIV1` into [ApiV1]. -impl From<&WSLPluginAPIV1> for &ApiV1 { - fn from(internal: &WSLPluginAPIV1) -> Self { - unsafe { &*(internal as *const WSLPluginAPIV1 as *const ApiV1) } +impl AsRef for ApiV1 { + fn as_ref(&self) -> &WSLPluginAPIV1 { + &self.0 + } +} + +impl AsRef for WSLPluginAPIV1 { + fn as_ref(&self) -> &ApiV1 { + unsafe { &*(self as *const WSLPluginAPIV1 as *const ApiV1) } } } diff --git a/wslplugins-rs/src/plugin/utils.rs b/wslplugins-rs/src/plugin/utils.rs index ec5b357..f34da12 100644 --- a/wslplugins-rs/src/plugin/utils.rs +++ b/wslplugins-rs/src/plugin/utils.rs @@ -50,7 +50,7 @@ pub fn create_plugin_with_required_version( wslplugins_sys::require_version(required_major, required_minor, required_revision, api) .ok()?; } - if let Some(context) = WSLContext::init(api.into()) { + if let Some(context) = WSLContext::init(api.as_ref()) { let plugin = T::try_new(context)?; Ok(plugin) } else { From 3231899047c33e65fac89584170b2d37721331db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Sun, 19 Jan 2025 20:40:59 +0100 Subject: [PATCH 5/7] Impove and add From --- wslplugins-rs/src/api/api_v1.rs | 12 ++++++++++ wslplugins-rs/src/distribution_information.rs | 12 ++++++++++ .../src/offline_distribution_information.rs | 13 +++++++++++ wslplugins-rs/src/wsl_session_information.rs | 22 ++++++++----------- wslplugins-rs/src/wsl_vm_creation_settings.rs | 12 ++++++++++ 5 files changed, 58 insertions(+), 13 deletions(-) diff --git a/wslplugins-rs/src/api/api_v1.rs b/wslplugins-rs/src/api/api_v1.rs index d4df5f2..2be24bd 100644 --- a/wslplugins-rs/src/api/api_v1.rs +++ b/wslplugins-rs/src/api/api_v1.rs @@ -33,6 +33,18 @@ use super::utils::check_required_version_result; #[repr(transparent)] pub struct ApiV1(WSLPluginAPIV1); +impl From for WSLPluginAPIV1 { + fn from(value: ApiV1) -> Self { + value.0 + } +} + +impl From for ApiV1 { + fn from(value: WSLPluginAPIV1) -> Self { + ApiV1(value) + } +} + impl AsRef for ApiV1 { fn as_ref(&self) -> &WSLPluginAPIV1 { &self.0 diff --git a/wslplugins-rs/src/distribution_information.rs b/wslplugins-rs/src/distribution_information.rs index 4e923b3..101b7e2 100644 --- a/wslplugins-rs/src/distribution_information.rs +++ b/wslplugins-rs/src/distribution_information.rs @@ -43,12 +43,24 @@ impl AsRef for wslplugins_sys::WSLDistributionInformati } } +impl From for wslplugins_sys::WSLDistributionInformation { + fn from(value: DistributionInformation) -> Self { + value.0 + } +} + impl AsRef for DistributionInformation { fn as_ref(&self) -> &wslplugins_sys::WSLDistributionInformation { &self.0 } } +impl From for DistributionInformation { + fn from(value: wslplugins_sys::WSLDistributionInformation) -> Self { + DistributionInformation(value) + } +} + impl DistributionInformation { /// Retrieves the PID of the init process. /// diff --git a/wslplugins-rs/src/offline_distribution_information.rs b/wslplugins-rs/src/offline_distribution_information.rs index 60bc694..58278c8 100644 --- a/wslplugins-rs/src/offline_distribution_information.rs +++ b/wslplugins-rs/src/offline_distribution_information.rs @@ -19,6 +19,19 @@ use windows::core::GUID; /// its ID, name, and optional package family name. #[repr(transparent)] pub struct OfflineDistributionInformation(wslplugins_sys::WslOfflineDistributionInformation); + +impl From for wslplugins_sys::WslOfflineDistributionInformation { + fn from(value: OfflineDistributionInformation) -> Self { + value.0 + } +} + +impl From for OfflineDistributionInformation { + fn from(value: wslplugins_sys::WslOfflineDistributionInformation) -> Self { + OfflineDistributionInformation(value) + } +} + impl AsRef for OfflineDistributionInformation { fn as_ref(&self) -> &wslplugins_sys::WslOfflineDistributionInformation { &self.0 diff --git a/wslplugins-rs/src/wsl_session_information.rs b/wslplugins-rs/src/wsl_session_information.rs index b9e7e4a..ee8b528 100644 --- a/wslplugins-rs/src/wsl_session_information.rs +++ b/wslplugins-rs/src/wsl_session_information.rs @@ -44,19 +44,15 @@ impl WSLSessionInformation { } } -impl From<&wslplugins_sys::WSLSessionInformation> for &WSLSessionInformation { - /// Creates a `WSLSessionInformation` instance from a reference to `WSLSessionInformation` from the API. - /// - /// # Arguments - /// - `ptr`: A reference to a `WSLSessionInformation` instance. - /// - /// # Returns - /// A safe wrapper around the provided pointer. - fn from(internal: &wslplugins_sys::WSLSessionInformation) -> Self { - unsafe { - &*(internal as *const wslplugins_sys::WSLSessionInformation - as *const WSLSessionInformation) - } +impl From for WSLSessionInformation { + fn from(value: wslplugins_sys::WSLSessionInformation) -> Self { + WSLSessionInformation(value) + } +} + +impl From for wslplugins_sys::WSLSessionInformation { + fn from(value: WSLSessionInformation) -> Self { + value.0 } } diff --git a/wslplugins-rs/src/wsl_vm_creation_settings.rs b/wslplugins-rs/src/wsl_vm_creation_settings.rs index 976e0ff..2a0c802 100644 --- a/wslplugins-rs/src/wsl_vm_creation_settings.rs +++ b/wslplugins-rs/src/wsl_vm_creation_settings.rs @@ -17,6 +17,18 @@ use crate::WSLUserConfiguration; /// - `'a`: The lifetime of the referenced `WSLVmCreationSettings` instance. pub struct WSLVmCreationSettings(wslplugins_sys::WSLVmCreationSettings); +impl From for WSLVmCreationSettings { + fn from(value: wslplugins_sys::WSLVmCreationSettings) -> Self { + WSLVmCreationSettings(value) + } +} + +impl From for wslplugins_sys::WSLVmCreationSettings { + fn from(value: WSLVmCreationSettings) -> Self { + value.0 + } +} + impl AsRef for WSLVmCreationSettings { fn as_ref(&self) -> &wslplugins_sys::WSLVmCreationSettings { &self.0 From 5d924629ea118438616a31190714b4cdca2d87e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Thu, 23 Jan 2025 20:48:13 +0100 Subject: [PATCH 6/7] Fix in doc --- wslplugins-rs/src/wsl_session_information.rs | 4 +--- wslplugins-rs/src/wsl_vm_creation_settings.rs | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/wslplugins-rs/src/wsl_session_information.rs b/wslplugins-rs/src/wsl_session_information.rs index ee8b528..736f6f7 100644 --- a/wslplugins-rs/src/wsl_session_information.rs +++ b/wslplugins-rs/src/wsl_session_information.rs @@ -13,9 +13,7 @@ use windows::Win32::Security::PSID; /// /// This struct wraps the `WSLSessionInformation` provided by the WSL Plugin API and /// provides safe, idiomatic access to its fields. -/// -/// # Lifetime Parameters -/// - `'a`: The lifetime of the referenced `WSLSessionInformation` instance. + pub struct WSLSessionInformation(wslplugins_sys::WSLSessionInformation); impl WSLSessionInformation { diff --git a/wslplugins-rs/src/wsl_vm_creation_settings.rs b/wslplugins-rs/src/wsl_vm_creation_settings.rs index 2a0c802..12ffd28 100644 --- a/wslplugins-rs/src/wsl_vm_creation_settings.rs +++ b/wslplugins-rs/src/wsl_vm_creation_settings.rs @@ -12,9 +12,7 @@ use crate::WSLUserConfiguration; /// /// This struct wraps the `WSLVmCreationSettings` structure from the WSL Plugin API, providing /// safe and idiomatic Rust access to its fields. -/// -/// # Lifetime Parameters -/// - `'a`: The lifetime of the referenced `WSLVmCreationSettings` instance. + pub struct WSLVmCreationSettings(wslplugins_sys::WSLVmCreationSettings); impl From for WSLVmCreationSettings { From 01705991b8fd8e6ce1f6809f9bea5cfa2615072a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Fri, 24 Jan 2025 13:08:08 +0100 Subject: [PATCH 7/7] clippy fix --- wslplugins-rs/src/wsl_session_information.rs | 1 - wslplugins-rs/src/wsl_vm_creation_settings.rs | 1 - 2 files changed, 2 deletions(-) diff --git a/wslplugins-rs/src/wsl_session_information.rs b/wslplugins-rs/src/wsl_session_information.rs index 736f6f7..4c71432 100644 --- a/wslplugins-rs/src/wsl_session_information.rs +++ b/wslplugins-rs/src/wsl_session_information.rs @@ -13,7 +13,6 @@ use windows::Win32::Security::PSID; /// /// This struct wraps the `WSLSessionInformation` provided by the WSL Plugin API and /// provides safe, idiomatic access to its fields. - pub struct WSLSessionInformation(wslplugins_sys::WSLSessionInformation); impl WSLSessionInformation { diff --git a/wslplugins-rs/src/wsl_vm_creation_settings.rs b/wslplugins-rs/src/wsl_vm_creation_settings.rs index 12ffd28..8e44ec4 100644 --- a/wslplugins-rs/src/wsl_vm_creation_settings.rs +++ b/wslplugins-rs/src/wsl_vm_creation_settings.rs @@ -12,7 +12,6 @@ use crate::WSLUserConfiguration; /// /// This struct wraps the `WSLVmCreationSettings` structure from the WSL Plugin API, providing /// safe and idiomatic Rust access to its fields. - pub struct WSLVmCreationSettings(wslplugins_sys::WSLVmCreationSettings); impl From for WSLVmCreationSettings {