1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#[cfg(windows)]
/// https://learn.microsoft.com/en-us/windows/win32/api/realtimeapiset/nf-realtimeapiset-queryunbiasedinterrupttime
unsafe fn _active_time() -> std::io::Result<std::time::Duration> {
    let mut ticks = std::mem::MaybeUninit::uninit();
    let success = winapi::um::realtimeapiset::QueryUnbiasedInterruptTime(ticks.as_mut_ptr()) != 0;
    if success {
        Ok(std::time::Duration::from_nanos(ticks.assume_init() * 100))
    } else {
        Err(std::io::Error::last_os_error())
    }
}

/// Returns the active time of the OS, not including sleep/hibernation.
pub fn active_time() -> std::io::Result<std::time::Duration> {
    unsafe {
        _active_time()
    }
}