ipmb 0.8.5

Inter-process message bus
Documentation
use crate::{platform::MappedRegion, Error, MemoryRegion, Object};
use std::{mem, sync::Once};
use windows::Win32::{
    Foundation,
    System::{Memory, SystemInformation},
};

impl MemoryRegion {
    pub(crate) fn obj_new(size: usize) -> Option<Object> {
        unsafe {
            let handle: Foundation::HANDLE = Memory::CreateFileMappingW(
                Foundation::INVALID_HANDLE_VALUE,
                None,
                Memory::PAGE_READWRITE,
                size.checked_shr(32).unwrap_or(0) as _,
                size as _,
                None,
            )
            .ok()?;
            let handle = Object::from_raw(handle.0 as _);
            Some(handle)
        }
    }
}

impl MappedRegion {
    pub(crate) fn map(
        obj: &Object,
        aligned_offset: usize,
        aligned_size: usize,
    ) -> Result<*mut u8, Error> {
        unsafe {
            let view_ptr = Memory::MapViewOfFile(
                obj.as_raw_windows(),
                Memory::FILE_MAP_READ | Memory::FILE_MAP_WRITE,
                aligned_offset.checked_shr(32).unwrap_or(0) as _,
                aligned_offset as _,
                aligned_size,
            )?;
            Ok(view_ptr.0 as *mut u8)
        }
    }

    pub(crate) fn unmap(addr: *mut u8, len: usize) {
        let _ = len;
        unsafe {
            let r = Memory::UnmapViewOfFile(Memory::MEMORYMAPPEDVIEW_HANDLE(addr as _));
            assert!(r.as_bool());
        }
    }
}

static mut PAGE_MASK: usize = 0;
static PAGE_MASK_ONCE: Once = Once::new();
pub(crate) fn page_mask() -> usize {
    unsafe {
        PAGE_MASK_ONCE.call_once(|| {
            let mut info = mem::zeroed();
            SystemInformation::GetSystemInfo(&mut info);
            PAGE_MASK = info.dwAllocationGranularity as usize - 1;
        });
        PAGE_MASK
    }
}