use crate::*;
use bytemuck::*;
use winapi::um::winnt::*;
use core::mem::size_of_val;
#[derive(Clone, Debug, Default)]
pub struct BasicProcessIdList {
pub number_of_assigned_processes: u32,
pub number_of_process_ids_in_list: u32,
pub process_id_list: std::vec::Vec<usize>,
}
impl job::QueryInformationJobObject for job::object::BasicProcessIdList { fn query_from(job: &job::OwnedHandle) -> Result<Self, Error> {
let mut process_id_list = unsafe { job::query_vec::<usize>(job, JobObjectBasicProcessIdList) }?;
let mut header = Header::zeroed();
let header_bytes = size_of_val(&header);
bytes_of_mut(&mut header).copy_from_slice(&cast_slice(&process_id_list[..])[..header_bytes]);
let to_remove = header_bytes / size_of_val(&process_id_list[0]);
let _ = process_id_list.drain(..to_remove); let Header { number_of_assigned_processes, number_of_process_ids_in_list } = header;
Ok(Self {
number_of_assigned_processes,
number_of_process_ids_in_list,
process_id_list,
})
}}
#[derive(Clone, Copy, Debug)]
#[derive(Pod, Zeroable)]
#[repr(C)] struct Header {
pub number_of_assigned_processes: u32,
pub number_of_process_ids_in_list: u32,
}
#[allow(dead_code)] #[repr(C)] struct HeaderPlusOneProcess {
header: Header,
process_id_list: [usize; 1]
}
structure!(@assert layout HeaderPlusOneProcess => JOBOBJECT_BASIC_PROCESS_ID_LIST {
process_id_list == ProcessIdList,
});