moon-driver-utils 0.1.0

Windows Kernel Utils
use core::ops::{Deref, DerefMut};

use wdk_sys::{
    ntddk::{IoCreateNotificationEvent, KeClearEvent, KeSetEvent},
    PKEVENT,
};

use super::handle::Handle;

pub struct Event {
    raw: PKEVENT,
    #[allow(unused)]
    h: Handle,
}

// todo: present only notify event
impl Event {
    pub fn new() -> Result<Self, &'static str> {
        let mut event_handle = Handle::default();
        unsafe {
            let event = IoCreateNotificationEvent(core::ptr::null_mut(), event_handle.as_ptr());
            if event.is_null() {
                return Err("IoCreateNotificationEvent Error");
            }

            KeClearEvent(event);

            let r = Self {
                raw: event,
                h: event_handle,
            };

            Ok(r)
        }
    }

    pub fn clear(&mut self) {
        unsafe {
            KeClearEvent(self.raw);
        }
    }

    pub fn from(raw: PKEVENT) -> Self {
        Self {
            raw,
            h: Handle::default(),
        }
    }

    pub fn as_ptr(&mut self) -> PKEVENT {
        self.raw
    }

    pub fn set(&mut self) {
        unsafe {
            KeSetEvent(self.raw, 0, 0);
        }
    }
}

impl Deref for Event {
    type Target = PKEVENT;

    fn deref(&self) -> &Self::Target {
        &self.raw
    }
}

impl DerefMut for Event {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.raw
    }
}

impl Drop for Event {
    fn drop(&mut self) {
        // if !self.raw.is_null() {}
    }
}