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,
}
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) {
}
}