moon-driver-utils 0.1.0

Windows Kernel Utils
use core::ffi::c_void;

use wdk_sys::ntddk::{ExAcquirePushLockSharedEx, ExReleasePushLockSharedEx};

pub struct PushLockShared {
    raw: *mut c_void,
}

pub struct PushLockSharedGuard<'a> {
    fast_mutex: &'a PushLockShared,
}

impl PushLockShared {
    pub fn from_raw(raw: *mut c_void) -> Self {
        Self { raw }
    }

    pub fn lock(&self) -> PushLockSharedGuard {
        unsafe { ExAcquirePushLockSharedEx(&self.raw as *const _ as *mut _, 0) };
        PushLockSharedGuard { fast_mutex: self }
    }
}

impl Drop for PushLockSharedGuard<'_> {
    fn drop(&mut self) {
        unsafe { ExReleasePushLockSharedEx(&self.fast_mutex.raw as *const _ as *mut _, 0) };
    }
}