check out disk data
This commit is contained in:
@@ -472,9 +472,12 @@ fn get_cpu_temp() -> Option<f32> {
|
|||||||
use com::runtime::init_runtime;
|
use com::runtime::init_runtime;
|
||||||
use com::sys::{CLSCTX_INPROC_SERVER, COINIT_MULTITHREADED};
|
use com::sys::{CLSCTX_INPROC_SERVER, COINIT_MULTITHREADED};
|
||||||
use widestring::U16CString;
|
use widestring::U16CString;
|
||||||
|
use winapi::shared::rpcdce::*;
|
||||||
use winapi::shared::wtypes::VT_I4;
|
use winapi::shared::wtypes::VT_I4;
|
||||||
use winapi::um::oaidl::VARIANT;
|
use winapi::um::oaidl::VARIANT;
|
||||||
|
use winapi::um::objidlbase::EOAC_NONE;
|
||||||
use winapi::um::{combaseapi, wbemcli};
|
use winapi::um::{combaseapi, wbemcli};
|
||||||
|
|
||||||
init_runtime().ok()?;
|
init_runtime().ok()?;
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
@@ -493,7 +496,7 @@ fn get_cpu_temp() -> Option<f32> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mut services: *mut wbemcli::IWbemServices = std::ptr::null_mut();
|
let mut services: *mut wbemcli::IWbemServices = std::ptr::null_mut();
|
||||||
let namespace = U16CString::from_str("root\\wmi").unwrap();
|
let namespace = U16CString::from_str("root\\cimv2").unwrap(); // Changed to more common namespace
|
||||||
let hr = (*locator).ConnectServer(
|
let hr = (*locator).ConnectServer(
|
||||||
namespace.as_ptr().cast_mut(),
|
namespace.as_ptr().cast_mut(),
|
||||||
std::ptr::null_mut(),
|
std::ptr::null_mut(),
|
||||||
@@ -507,26 +510,53 @@ fn get_cpu_temp() -> Option<f32> {
|
|||||||
|
|
||||||
if hr != 0 {
|
if hr != 0 {
|
||||||
eprintln!("Failed to connect to WMI (HRESULT: {})", hr);
|
eprintln!("Failed to connect to WMI (HRESULT: {})", hr);
|
||||||
|
(*locator).Release();
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let query =
|
// Set security levels
|
||||||
U16CString::from_str("SELECT * FROM MSAcpi_ThermalZoneTemperature").unwrap();
|
let hr = combaseapi::CoSetProxyBlanket(
|
||||||
let mut enumerator: *mut wbemcli::IEnumWbemClassObject = std::ptr::null_mut();
|
services as *mut _,
|
||||||
let hr = (*services).ExecQuery(
|
RPC_C_AUTHN_WINNT,
|
||||||
U16CString::from_str("WQL").unwrap().as_ptr().cast_mut(),
|
RPC_C_AUTHZ_NONE,
|
||||||
query.as_ptr().cast_mut(),
|
|
||||||
wbemcli::WBEM_FLAG_FORWARD_ONLY as i32,
|
|
||||||
std::ptr::null_mut(),
|
std::ptr::null_mut(),
|
||||||
&mut enumerator,
|
RPC_C_AUTHN_LEVEL_CALL,
|
||||||
|
RPC_C_IMP_LEVEL_IMPERSONATE,
|
||||||
|
std::ptr::null_mut(),
|
||||||
|
EOAC_NONE,
|
||||||
);
|
);
|
||||||
|
|
||||||
if hr != 0 {
|
if hr != 0 {
|
||||||
eprintln!("Failed to execute WMI query (HRESULT: {})", hr);
|
eprintln!("Failed to set proxy blanket (HRESULT: {})", hr);
|
||||||
|
(*services).Release();
|
||||||
|
(*locator).Release();
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
loop {
|
// Try different temperature queries - some systems might have different WMI classes
|
||||||
|
let queries = [
|
||||||
|
"SELECT * FROM Win32_PerfFormattedData_Counters_ThermalZoneInformation",
|
||||||
|
"SELECT * FROM MSAcpi_ThermalZoneTemperature",
|
||||||
|
"SELECT * FROM Win32_TemperatureProbe",
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut result = None;
|
||||||
|
|
||||||
|
for query_str in queries.iter() {
|
||||||
|
let query = U16CString::from_str(query_str).unwrap();
|
||||||
|
let mut enumerator: *mut wbemcli::IEnumWbemClassObject = std::ptr::null_mut();
|
||||||
|
let hr = (*services).ExecQuery(
|
||||||
|
U16CString::from_str("WQL").unwrap().as_ptr().cast_mut(),
|
||||||
|
query.as_ptr().cast_mut(),
|
||||||
|
wbemcli::WBEM_FLAG_FORWARD_ONLY as i32,
|
||||||
|
std::ptr::null_mut(),
|
||||||
|
&mut enumerator,
|
||||||
|
);
|
||||||
|
|
||||||
|
if hr != 0 {
|
||||||
|
continue; // Try next query if this one fails
|
||||||
|
}
|
||||||
|
|
||||||
let mut obj: *mut wbemcli::IWbemClassObject = std::ptr::null_mut();
|
let mut obj: *mut wbemcli::IWbemClassObject = std::ptr::null_mut();
|
||||||
let mut returned = 0;
|
let mut returned = 0;
|
||||||
let hr = (*enumerator).Next(
|
let hr = (*enumerator).Next(
|
||||||
@@ -536,28 +566,43 @@ fn get_cpu_temp() -> Option<f32> {
|
|||||||
&mut returned,
|
&mut returned,
|
||||||
);
|
);
|
||||||
|
|
||||||
if hr != 0 || returned == 0 {
|
if hr == 0 && returned > 0 {
|
||||||
break;
|
let mut variant = std::mem::zeroed::<VARIANT>();
|
||||||
|
// Try different possible property names
|
||||||
|
let property_names = ["CurrentTemperature", "Temperature", "CurrentReading"];
|
||||||
|
|
||||||
|
for prop in property_names.iter() {
|
||||||
|
let hr = (*obj).Get(
|
||||||
|
U16CString::from_str(prop).unwrap().as_ptr(),
|
||||||
|
0,
|
||||||
|
&mut variant,
|
||||||
|
std::ptr::null_mut(),
|
||||||
|
std::ptr::null_mut(),
|
||||||
|
);
|
||||||
|
|
||||||
|
if hr == 0 && variant.n1.n2().vt as u32 == VT_I4 {
|
||||||
|
let temp_kelvin = *variant.n1.n2().n3.intVal() as f32 / 10.0;
|
||||||
|
result = Some(temp_kelvin - 273.15); // Convert to Celsius
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(*obj).Release();
|
||||||
|
(*enumerator).Release();
|
||||||
|
if result.is_some() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut variant = std::mem::zeroed::<VARIANT>();
|
if !enumerator.is_null() {
|
||||||
let hr = (*obj).Get(
|
(*enumerator).Release();
|
||||||
U16CString::from_str("CurrentTemperature").unwrap().as_ptr(),
|
|
||||||
0,
|
|
||||||
&mut variant,
|
|
||||||
std::ptr::null_mut(),
|
|
||||||
std::ptr::null_mut(),
|
|
||||||
);
|
|
||||||
|
|
||||||
if hr == 0 && variant.n1.n2().vt as u32 == VT_I4 {
|
|
||||||
let temp_kelvin = *variant.n1.n2().n3.intVal() as f32 / 10.0;
|
|
||||||
Some(temp_kelvin - 273.15);
|
|
||||||
} else {
|
|
||||||
return None;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
None
|
(*services).Release();
|
||||||
|
(*locator).Release();
|
||||||
|
|
||||||
|
result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user