fs-id 0.2.0

Uniquely identify files within the system
Documentation
use std::{io, mem, os::windows::io::AsRawHandle, ffi::c_void};
use winapi::um::{winbase::GetFileInformationByHandleEx, minwinbase::FileIdInfo, fileapi::FILE_ID_INFO};
use crate::{GetID, FileID};

pub type FileIDImpl = (u64, u128);

impl<T: AsRawHandle> GetID for T {
	fn get_id(&self) -> io::Result<FileID> {
		let handle = self.as_raw_handle();
		unsafe {
			let mut info: FILE_ID_INFO = mem::zeroed();
			if GetFileInformationByHandleEx(
				handle,
				FileIdInfo,
				&mut info as *mut _ as *mut c_void,
				mem::size_of_val(&info) as u32
			) == 0 {
				Err(io::Error::last_os_error())	
			} else {
				Ok(FileID((info.VolumeSerialNumber, u128::from_ne_bytes(info.FileId.Identifier))))				
			}
		}
	}
}