use core::ffi::c_void;
use windows_sys::Win32::Foundation::{BOOL, HANDLE};
use windows_sys::Win32::Networking::WinSock::SOCKADDR_STORAGE;
use windows_sys::core::HRESULT;
pub const WSLC_SESSION_OPTIONS_SIZE: usize = 72;
pub const WSLC_SESSION_OPTIONS_ALIGNMENT: usize = 8;
pub const WSLC_CONTAINER_OPTIONS_SIZE: usize = 104;
pub const WSLC_CONTAINER_OPTIONS_ALIGNMENT: usize = 8;
pub const WSLC_CONTAINER_PROCESS_OPTIONS_SIZE: usize = 72;
pub const WSLC_CONTAINER_PROCESS_OPTIONS_ALIGNMENT: usize = 8;
pub const WSLC_CONTAINER_ID_BUFFER_SIZE: usize = 65;
pub const WSLC_IMAGE_NAME_LENGTH: usize = 256;
#[repr(transparent)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct WslcSession(pub HANDLE);
impl WslcSession {
pub const NULL: Self = Self(core::ptr::null_mut());
pub fn is_null(&self) -> bool {
self.0.is_null()
}
}
impl Default for WslcSession {
fn default() -> Self {
Self::NULL
}
}
#[repr(transparent)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct WslcContainer(pub HANDLE);
impl WslcContainer {
pub const NULL: Self = Self(core::ptr::null_mut());
pub fn is_null(&self) -> bool {
self.0.is_null()
}
}
impl Default for WslcContainer {
fn default() -> Self {
Self::NULL
}
}
#[repr(transparent)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct WslcProcess(pub HANDLE);
impl WslcProcess {
pub const NULL: Self = Self(core::ptr::null_mut());
pub fn is_null(&self) -> bool {
self.0.is_null()
}
}
impl Default for WslcProcess {
fn default() -> Self {
Self::NULL
}
}
#[repr(transparent)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct WslcCrashDumpSubscription(pub HANDLE);
impl WslcCrashDumpSubscription {
pub const NULL: Self = Self(core::ptr::null_mut());
pub fn is_null(&self) -> bool {
self.0.is_null()
}
}
impl Default for WslcCrashDumpSubscription {
fn default() -> Self {
Self::NULL
}
}
#[repr(C, align(8))]
#[derive(Copy, Clone, Debug)]
pub struct WslcSessionSettings {
pub(crate) _opaque: [u8; WSLC_SESSION_OPTIONS_SIZE],
}
impl Default for WslcSessionSettings {
fn default() -> Self {
Self {
_opaque: [0u8; WSLC_SESSION_OPTIONS_SIZE],
}
}
}
#[repr(C, align(8))]
#[derive(Copy, Clone, Debug)]
pub struct WslcContainerSettings {
pub(crate) _opaque: [u8; WSLC_CONTAINER_OPTIONS_SIZE],
}
impl Default for WslcContainerSettings {
fn default() -> Self {
Self {
_opaque: [0u8; WSLC_CONTAINER_OPTIONS_SIZE],
}
}
}
#[repr(C, align(8))]
#[derive(Copy, Clone, Debug)]
pub struct WslcProcessSettings {
pub(crate) _opaque: [u8; WSLC_CONTAINER_PROCESS_OPTIONS_SIZE],
}
impl Default for WslcProcessSettings {
fn default() -> Self {
Self {
_opaque: [0u8; WSLC_CONTAINER_PROCESS_OPTIONS_SIZE],
}
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum WslcContainerNetworkingMode {
#[default]
None = 0,
Bridged = 1,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum WslcVhdType {
#[default]
Dynamic = 0,
Fixed = 1,
}
pub type WslcVhdRequirementsFlags = u32;
pub const WSLC_VHD_REQ_FLAG_NONE: WslcVhdRequirementsFlags = 0x00000000;
pub const WSLC_VHD_REQ_FLAG_OWNER: WslcVhdRequirementsFlags = 0x00000001;
pub type WslcSessionFeatureFlags = u32;
pub const WSLC_SESSION_FEATURE_FLAG_NONE: WslcSessionFeatureFlags = 0x00000000;
pub const WSLC_SESSION_FEATURE_FLAG_ENABLE_GPU: WslcSessionFeatureFlags = 0x00000004;
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum WslcSessionTerminationReason {
#[default]
Unknown = 0,
Shutdown = 1,
Crashed = 2,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum WslcPortProtocol {
#[default]
Tcp = 0,
Udp = 1,
}
pub type WslcContainerFlags = u32;
pub const WSLC_CONTAINER_FLAG_NONE: WslcContainerFlags = 0x00000000;
pub const WSLC_CONTAINER_FLAG_AUTO_REMOVE: WslcContainerFlags = 0x00000001;
pub const WSLC_CONTAINER_FLAG_ENABLE_GPU: WslcContainerFlags = 0x00000002;
pub const WSLC_CONTAINER_FLAG_PRIVILEGED: WslcContainerFlags = 0x00000004;
pub type WslcContainerStartFlags = u32;
pub const WSLC_CONTAINER_START_FLAG_NONE: WslcContainerStartFlags = 0x00000000;
pub const WSLC_CONTAINER_START_FLAG_ATTACH: WslcContainerStartFlags = 0x00000001;
pub type WslcDeleteContainerFlags = u32;
pub const WSLC_DELETE_CONTAINER_FLAG_NONE: WslcDeleteContainerFlags = 0x00000000;
pub const WSLC_DELETE_CONTAINER_FLAG_FORCE: WslcDeleteContainerFlags = 0x00000001;
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum WslcContainerState {
#[default]
Invalid = 0,
Created = 1,
Running = 2,
Exited = 3,
Deleted = 4,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum WslcSignal {
#[default]
None = 0,
Sighup = 1,
Sigint = 2,
Sigquit = 3,
Sigkill = 9,
Sigterm = 15,
}
pub type WslcProcessFlags = u32;
pub const WSLC_PROCESS_FLAG_NONE: WslcProcessFlags = 0x00000000;
pub const WSLC_PROCESS_FLAG_STDIN: WslcProcessFlags = 0x00000001;
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum WslcProcessIOHandle {
#[default]
Stdin = 0,
Stdout = 1,
Stderr = 2,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum WslcProcessState {
#[default]
Unknown = 0,
Running = 1,
Exited = 2,
Signalled = 3,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum WslcImageProgressStatus {
#[default]
Unknown = 0,
Pulling = 1,
Waiting = 2,
Downloading = 3,
Verifying = 4,
Extracting = 5,
Complete = 6,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum WslcIdentityTokenType {
#[default]
Unknown = 0,
Token = 1,
Credentials = 2,
}
pub type WslcComponentFlags = u32;
pub const WSLC_COMPONENT_FLAG_NONE: WslcComponentFlags = 0;
pub const WSLC_COMPONENT_FLAG_VIRTUAL_MACHINE_PLATFORM: WslcComponentFlags = 1;
pub const WSLC_COMPONENT_FLAG_WSL_PACKAGE: WslcComponentFlags = 2;
pub const WSLC_COMPONENT_FLAG_SDK_NEEDS_UPDATE: WslcComponentFlags = 4;
pub type WslcInstallOptions = u32;
pub const WSLC_INSTALL_OPTION_NONE: WslcInstallOptions = 0;
pub const WSLC_INSTALL_OPTION_REPAIR: WslcInstallOptions = 1;
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WslcVhdRequirements {
pub name: *const i8,
pub size_bytes: u64,
pub vhd_type: WslcVhdType,
pub flags: WslcVhdRequirementsFlags,
pub uid: u32,
pub gid: u32,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WslcSessionCrashDumpInfo {
pub dump_path: *const u16,
pub process_name: *const i8,
pub pid: u32,
pub signal: u32,
pub timestamp: u64,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WslcContainerPortMapping {
pub windows_port: u16,
pub container_port: u16,
pub protocol: WslcPortProtocol,
pub windows_address: *mut SOCKADDR_STORAGE,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WslcContainerVolume {
pub windows_path: *const u16,
pub container_path: *const i8,
pub read_only: BOOL,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WslcContainerNamedVolume {
pub name: *const i8,
pub container_path: *const i8,
pub read_only: BOOL,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Default)]
pub struct WslcImageProgressDetail {
pub current_bytes: u64,
pub total_bytes: u64,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WslcImageProgressMessage {
pub id: *const i8,
pub status: WslcImageProgressStatus,
pub detail: WslcImageProgressDetail,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WslcImageInfo {
pub name: [u8; WSLC_IMAGE_NAME_LENGTH],
pub sha256: [u8; 32],
pub size_bytes: i64,
pub created_unix_time: u64,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
pub struct WslcVersion {
pub major: u32,
pub minor: u32,
pub revision: u32,
}
pub type WslcSessionCrashDumpCallback =
Option<unsafe extern "system" fn(info: *const WslcSessionCrashDumpInfo, context: *mut c_void)>;
pub type WslcStdIOCallback = Option<
unsafe extern "system" fn(
io_handle: WslcProcessIOHandle,
data: *const u8,
data_bytes: u32,
context: *mut c_void,
),
>;
pub type WslcProcessExitCallback =
Option<unsafe extern "system" fn(exit_code: i32, context: *mut c_void)>;
#[repr(C)]
#[derive(Copy, Clone, Debug, Default)]
pub struct WslcProcessCallbacks {
pub on_stdout: WslcStdIOCallback,
pub on_stderr: WslcStdIOCallback,
pub on_exit: WslcProcessExitCallback,
}
pub type WslcContainerImageProgressCallback = Option<
unsafe extern "system" fn(
progress: *const WslcImageProgressMessage,
context: *mut c_void,
) -> HRESULT,
>;
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WslcPullImageOptions {
pub uri: *const i8,
pub progress_callback: WslcContainerImageProgressCallback,
pub progress_callback_context: *mut c_void,
pub registry_auth: *const i8,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Default)]
pub struct WslcImportImageOptions {
pub progress_callback: WslcContainerImageProgressCallback,
pub progress_callback_context: *mut c_void,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Default)]
pub struct WslcLoadImageOptions {
pub progress_callback: WslcContainerImageProgressCallback,
pub progress_callback_context: *mut c_void,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WslcTagImageOptions {
pub image: *const i8,
pub repo: *const i8,
pub tag: *const i8,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WslcPushImageOptions {
pub image: *const i8,
pub registry_auth: *const i8,
pub progress_callback: WslcContainerImageProgressCallback,
pub progress_callback_context: *mut c_void,
}
pub type WslcInstallCallback = Option<
unsafe extern "system" fn(
component: WslcComponentFlags,
progress_steps: u32,
total_steps: u32,
context: *mut c_void,
),
>;