use crate::*;
use winapi::shared::minwindef::FALSE;
use winapi::shared::winerror::ERROR_BUFFER_OVERFLOW;
use winapi::um::memoryapi::ReadProcessMemory;
use core::mem::{MaybeUninit, size_of_val, size_of};
pub unsafe fn read_process_memory<'a, 'p, T>(
process: impl AsRef<process::PsuedoHandle<'p>>,
base_address: *const T,
buffer: &'a mut [MaybeUninit<T>],
) -> Result<&'a [T], Error> {
let size = size_of_val(buffer);
let mut read = 0;
Error::get_last_if(FALSE == unsafe { ReadProcessMemory(process.as_ref().as_handle(), base_address.cast(), buffer.as_mut_ptr().cast(), size, &mut read) })?;
if read > size { return Err(Error(ERROR_BUFFER_OVERFLOW)) }
let n = read/size_of::<T>();
Ok(unsafe { slice_assume_init_ref(&buffer[..n]) })
}
const unsafe fn slice_assume_init_ref<T>(slice: &[MaybeUninit<T>]) -> &[T] {
unsafe { &*(slice as *const [MaybeUninit<T>] as *const [T]) }
}