kael 0.2.0

GPU-accelerated native UI framework for Rust — build desktop apps with Metal, DirectX, and Vulkan rendering
Documentation
use windows::Win32::System::WindowsProgramming::GetComputerNameW;
use windows::core::PWSTR;

use crate::OsInfo;

pub(crate) fn get_os_info() -> OsInfo {
    let version = get_windows_version();
    let hostname = get_hostname();
    let locale = get_locale();

    OsInfo {
        name: "windows".into(),
        version: version.into(),
        arch: std::env::consts::ARCH.into(),
        locale: locale.into(),
        hostname: hostname.into(),
    }
}

fn get_windows_version() -> String {
    let mut info = unsafe { std::mem::zeroed() };
    let status = unsafe { windows::Wdk::System::SystemServices::RtlGetVersion(&mut info) };
    if status.is_ok() {
        format!(
            "{}.{}.{}",
            info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber
        )
    } else {
        String::new()
    }
}

fn get_hostname() -> String {
    let mut size: u32 = 256;
    let mut buffer = vec![0u16; size as usize];
    let result = unsafe { GetComputerNameW(Some(PWSTR(buffer.as_mut_ptr())), &mut size) };
    if result.is_ok() {
        String::from_utf16_lossy(&buffer[..size as usize])
    } else {
        String::new()
    }
}

fn get_locale() -> String {
    let mut buffer = [0u16; 85];
    let len = unsafe { windows::Win32::Globalization::GetUserDefaultLocaleName(&mut buffer) };
    if len > 0 {
        String::from_utf16_lossy(&buffer[..(len as usize - 1)])
    } else {
        String::new()
    }
}