1 use std::os::windows::io::RawHandle;
2 use windows_sys::Win32::Foundation::{CloseHandle, HANDLE};
3 
4 /// Wrapper around a Windows HANDLE so that we close it upon drop in all scenarios
5 #[derive(Debug)]
6 pub struct Handle(HANDLE);
7 
8 impl Handle {
9     #[inline]
new(handle: HANDLE) -> Self10     pub fn new(handle: HANDLE) -> Self {
11         Self(handle)
12     }
13 
raw(&self) -> HANDLE14     pub fn raw(&self) -> HANDLE {
15         self.0
16     }
17 
into_raw(self) -> RawHandle18     pub fn into_raw(self) -> RawHandle {
19         let ret = self.0;
20         // This is super important so that drop is not called!
21         std::mem::forget(self);
22         ret as RawHandle
23     }
24 }
25 
26 impl Drop for Handle {
drop(&mut self)27     fn drop(&mut self) {
28         unsafe { CloseHandle(self.0) };
29     }
30 }
31