From e718dcef6592f36aa6994327f6600f5369643b44 Mon Sep 17 00:00:00 2001 From: donpat1to Date: Sat, 2 Aug 2025 14:30:36 +0200 Subject: [PATCH] check out disk data --- WatcherAgent/src/main.rs | 101 ++++++++++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 28 deletions(-) diff --git a/WatcherAgent/src/main.rs b/WatcherAgent/src/main.rs index 25bb32b..2a1d029 100644 --- a/WatcherAgent/src/main.rs +++ b/WatcherAgent/src/main.rs @@ -472,9 +472,12 @@ fn get_cpu_temp() -> Option { use com::runtime::init_runtime; use com::sys::{CLSCTX_INPROC_SERVER, COINIT_MULTITHREADED}; use widestring::U16CString; + use winapi::shared::rpcdce::*; use winapi::shared::wtypes::VT_I4; use winapi::um::oaidl::VARIANT; + use winapi::um::objidlbase::EOAC_NONE; use winapi::um::{combaseapi, wbemcli}; + init_runtime().ok()?; unsafe { @@ -493,7 +496,7 @@ fn get_cpu_temp() -> Option { } 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( namespace.as_ptr().cast_mut(), std::ptr::null_mut(), @@ -507,26 +510,53 @@ fn get_cpu_temp() -> Option { if hr != 0 { eprintln!("Failed to connect to WMI (HRESULT: {})", hr); + (*locator).Release(); return None; } - let query = - U16CString::from_str("SELECT * FROM MSAcpi_ThermalZoneTemperature").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, + // Set security levels + let hr = combaseapi::CoSetProxyBlanket( + services as *mut _, + RPC_C_AUTHN_WINNT, + RPC_C_AUTHZ_NONE, 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 { - eprintln!("Failed to execute WMI query (HRESULT: {})", hr); + eprintln!("Failed to set proxy blanket (HRESULT: {})", hr); + (*services).Release(); + (*locator).Release(); 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 returned = 0; let hr = (*enumerator).Next( @@ -536,28 +566,43 @@ fn get_cpu_temp() -> Option { &mut returned, ); - if hr != 0 || returned == 0 { - break; + if hr == 0 && returned > 0 { + let mut variant = std::mem::zeroed::(); + // 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::(); - let hr = (*obj).Get( - 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; + if !enumerator.is_null() { + (*enumerator).Release(); } } - None + (*services).Release(); + (*locator).Release(); + + result } }