use std::ffi::c_void;
#[repr(C)]
#[derive(Default)]
struct ProcessMemoryCountersEx {
cb: u32,
page_fault_count: u32,
peak_working_set_size: usize,
working_set_size: usize,
quota_peak_paged_pool_usage: usize,
quota_paged_pool_usage: usize,
quota_peak_non_paged_pool_usage: usize,
quota_non_paged_pool_usage: usize,
pagefile_usage: usize,
peak_pagefile_usage: usize,
private_usage: usize,
}
const _: () = assert!(size_of::<ProcessMemoryCountersEx>() == 8 + 9 * size_of::<usize>());
#[link(name = "kernel32")]
extern "system" {
fn GetCurrentProcess() -> *mut c_void;
fn K32GetProcessMemoryInfo(
process: *mut c_void,
counters: *mut ProcessMemoryCountersEx,
cb: u32,
) -> i32;
}
pub fn private_bytes() -> usize {
let mut counters = ProcessMemoryCountersEx {
cb: size_of::<ProcessMemoryCountersEx>() as u32,
..Default::default()
};
let ok = unsafe { K32GetProcessMemoryInfo(GetCurrentProcess(), &mut counters, counters.cb) };
assert_ne!(ok, 0, "K32GetProcessMemoryInfo failed");
counters.private_usage
}