use std::io::Error;
use std::io::Result;
use std::mem::MaybeUninit;
use windows_sys::Win32::Foundation::FILETIME;
use windows_sys::Win32::Foundation::HANDLE;
use windows_sys::Win32::System::Threading::GetCurrentProcess;
use windows_sys::Win32::System::Threading::GetProcessTimes;
pub struct ProcessTimes {
pub create: FILETIME,
pub exit: FILETIME,
pub kernel: FILETIME,
pub user: FILETIME,
}
impl ProcessTimes {
pub fn capture_current() -> Result<Self> {
unsafe {
Self::capture_with_handle(
GetCurrentProcess()
)
}
}
pub unsafe fn capture_with_handle(handle: HANDLE)
-> Result<Self>
{
let mut create =
MaybeUninit::<FILETIME>::uninit();
let mut exit =
MaybeUninit::<FILETIME>::uninit();
let mut kernel =
MaybeUninit::<FILETIME>::uninit();
let mut user =
MaybeUninit::<FILETIME>::uninit();
let ret = unsafe {
GetProcessTimes(
handle,
create.as_mut_ptr(),
exit.as_mut_ptr(),
kernel.as_mut_ptr(),
user.as_mut_ptr(),
)
};
if ret == 0 {
return Err(Error::last_os_error());
}
Ok(unsafe {
Self {
create: create.assume_init(),
exit: exit.assume_init(),
kernel: kernel.assume_init(),
user: user.assume_init(),
}
})
}
}