| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  | #[cfg(windows)]
 | 
					
						
							| 
									
										
										
										
											2022-11-18 15:51:33 +08:00
										 |  |  | use dylib_virtual_display::win10::{idd, DRIVER_INSTALL_PATH};
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  | #[cfg(windows)]
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  | use std::{
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:21:02 +08:00
										 |  |  |     ffi::CStr,
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  |     io::{self, Read},
 | 
					
						
							|  |  |  |     path::Path,
 | 
					
						
							|  |  |  | };
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  | #[cfg(windows)]
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  | fn prompt_input() -> u8 {
 | 
					
						
							|  |  |  |     println!("Press  key                  execute:");
 | 
					
						
							|  |  |  |     println!("       1. 'x'               1. exit");
 | 
					
						
							|  |  |  |     println!("       2. 'i'               2. install or update driver");
 | 
					
						
							|  |  |  |     println!("       3. 'u'               3. uninstall driver");
 | 
					
						
							|  |  |  |     println!("       4. 'c'               4. create device");
 | 
					
						
							|  |  |  |     println!("       5. 'd'               5. destroy device");
 | 
					
						
							|  |  |  |     println!("       6. '1','2','3'       6. plug in monitor 0,1,2");
 | 
					
						
							|  |  |  |     println!("       7. '4','5','6'       7. plug out monitor 0,1,2");
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     io::stdin()
 | 
					
						
							|  |  |  |         .bytes()
 | 
					
						
							|  |  |  |         .next()
 | 
					
						
							|  |  |  |         .and_then(|result| result.ok())
 | 
					
						
							|  |  |  |         .unwrap_or(0)
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  | #[cfg(windows)]
 | 
					
						
							| 
									
										
										
										
											2022-03-12 19:51:55 +08:00
										 |  |  | unsafe fn plug_in(index: idd::UINT, edid: idd::UINT) {
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  |     println!("Plug in monitor begin");
 | 
					
						
							| 
									
										
										
										
											2022-03-12 19:51:55 +08:00
										 |  |  |     if idd::FALSE == idd::MonitorPlugIn(index, edid, 25) {
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  |         println!("{}", CStr::from_ptr(idd::GetLastMsg()).to_str().unwrap());
 | 
					
						
							|  |  |  |     } else {
 | 
					
						
							|  |  |  |         println!("Plug in monitor done");
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let mut modes: Vec<idd::MonitorMode> = Vec::new();
 | 
					
						
							|  |  |  |         modes.push(idd::MonitorMode {
 | 
					
						
							|  |  |  |             width: 1920 as idd::DWORD,
 | 
					
						
							|  |  |  |             height: 1080 as idd::DWORD,
 | 
					
						
							|  |  |  |             sync: 60 as idd::DWORD,
 | 
					
						
							|  |  |  |         });
 | 
					
						
							|  |  |  |         modes.push(idd::MonitorMode {
 | 
					
						
							|  |  |  |             width: 1024 as idd::DWORD,
 | 
					
						
							|  |  |  |             height: 768 as idd::DWORD,
 | 
					
						
							|  |  |  |             sync: 60 as idd::DWORD,
 | 
					
						
							|  |  |  |         });
 | 
					
						
							|  |  |  |         if idd::FALSE == idd::MonitorModesUpdate(index, modes.len() as u32, modes.as_mut_ptr()) {
 | 
					
						
							|  |  |  |             println!("{}", CStr::from_ptr(idd::GetLastMsg()).to_str().unwrap());
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  | #[cfg(windows)]
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  | unsafe fn plug_out(index: idd::UINT) {
 | 
					
						
							|  |  |  |     println!("Plug out monitor begin");
 | 
					
						
							|  |  |  |     if idd::FALSE == idd::MonitorPlugOut(index) {
 | 
					
						
							|  |  |  |         println!("{}", CStr::from_ptr(idd::GetLastMsg()).to_str().unwrap());
 | 
					
						
							|  |  |  |     } else {
 | 
					
						
							|  |  |  |         println!("Plug out monitor done");
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | fn main() {
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  |     #[cfg(windows)]
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         let abs_path = Path::new(DRIVER_INSTALL_PATH).canonicalize().unwrap();
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  |         unsafe {
 | 
					
						
							|  |  |  |             let invalid_device = 0 as idd::HSWDEVICE;
 | 
					
						
							|  |  |  |             let mut h_sw_device = invalid_device;
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:21:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  |             let full_inf_path: Vec<u16> = abs_path
 | 
					
						
							|  |  |  |                 .to_string_lossy()
 | 
					
						
							|  |  |  |                 .as_ref()
 | 
					
						
							|  |  |  |                 .encode_utf16()
 | 
					
						
							|  |  |  |                 .chain(Some(0).into_iter())
 | 
					
						
							|  |  |  |                 .collect();
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:21:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  |             loop {
 | 
					
						
							|  |  |  |                 match prompt_input() as char {
 | 
					
						
							|  |  |  |                     'x' => break,
 | 
					
						
							|  |  |  |                     'i' => {
 | 
					
						
							|  |  |  |                         println!("Install or update driver begin, {}", abs_path.display());
 | 
					
						
							|  |  |  |                         let mut reboot_required = idd::FALSE;
 | 
					
						
							|  |  |  |                         if idd::InstallUpdate(full_inf_path.as_ptr() as _, &mut reboot_required)
 | 
					
						
							|  |  |  |                             == idd::FALSE
 | 
					
						
							|  |  |  |                         {
 | 
					
						
							|  |  |  |                             println!("{}", CStr::from_ptr(idd::GetLastMsg()).to_str().unwrap());
 | 
					
						
							|  |  |  |                         } else {
 | 
					
						
							|  |  |  |                             println!(
 | 
					
						
							|  |  |  |                                 "Install or update driver done, reboot is {} required",
 | 
					
						
							|  |  |  |                                 if reboot_required == idd::FALSE {
 | 
					
						
							|  |  |  |                                     "not"
 | 
					
						
							|  |  |  |                                 } else {
 | 
					
						
							|  |  |  |                                     ""
 | 
					
						
							|  |  |  |                                 }
 | 
					
						
							|  |  |  |                             );
 | 
					
						
							|  |  |  |                         }
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  |                     }
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  |                     'u' => {
 | 
					
						
							|  |  |  |                         println!("Uninstall driver begin {}", abs_path.display());
 | 
					
						
							|  |  |  |                         let mut reboot_required = idd::FALSE;
 | 
					
						
							|  |  |  |                         if idd::Uninstall(full_inf_path.as_ptr() as _, &mut reboot_required)
 | 
					
						
							|  |  |  |                             == idd::FALSE
 | 
					
						
							|  |  |  |                         {
 | 
					
						
							|  |  |  |                             println!("{}", CStr::from_ptr(idd::GetLastMsg()).to_str().unwrap());
 | 
					
						
							|  |  |  |                         } else {
 | 
					
						
							|  |  |  |                             println!(
 | 
					
						
							|  |  |  |                                 "Uninstall driver done, reboot is {} required",
 | 
					
						
							|  |  |  |                                 if reboot_required == idd::FALSE {
 | 
					
						
							|  |  |  |                                     "not"
 | 
					
						
							|  |  |  |                                 } else {
 | 
					
						
							|  |  |  |                                     ""
 | 
					
						
							|  |  |  |                                 }
 | 
					
						
							|  |  |  |                             );
 | 
					
						
							|  |  |  |                         }
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  |                     }
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  |                     'c' => {
 | 
					
						
							|  |  |  |                         println!("Create device begin");
 | 
					
						
							|  |  |  |                         if h_sw_device != invalid_device {
 | 
					
						
							|  |  |  |                             println!("Device created before");
 | 
					
						
							|  |  |  |                             continue;
 | 
					
						
							|  |  |  |                         }
 | 
					
						
							|  |  |  |                         if idd::FALSE == idd::DeviceCreate(&mut h_sw_device) {
 | 
					
						
							|  |  |  |                             println!("{}", CStr::from_ptr(idd::GetLastMsg()).to_str().unwrap());
 | 
					
						
							|  |  |  |                             idd::DeviceClose(h_sw_device);
 | 
					
						
							|  |  |  |                             h_sw_device = invalid_device;
 | 
					
						
							|  |  |  |                         } else {
 | 
					
						
							|  |  |  |                             println!("Create device done");
 | 
					
						
							|  |  |  |                         }
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  |                     }
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  |                     'd' => {
 | 
					
						
							|  |  |  |                         println!("Close device begin");
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  |                         idd::DeviceClose(h_sw_device);
 | 
					
						
							|  |  |  |                         h_sw_device = invalid_device;
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  |                         println!("Close device done");
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  |                     }
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  |                     '1' => plug_in(0, 0),
 | 
					
						
							|  |  |  |                     '2' => plug_in(1, 0),
 | 
					
						
							|  |  |  |                     '3' => plug_in(2, 0),
 | 
					
						
							|  |  |  |                     '4' => plug_out(0),
 | 
					
						
							|  |  |  |                     '5' => plug_out(1),
 | 
					
						
							|  |  |  |                     '6' => plug_out(2),
 | 
					
						
							|  |  |  |                     _ => {}
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  |                 }
 | 
					
						
							|  |  |  |             }
 | 
					
						
							| 
									
										
										
										
											2022-03-12 19:51:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 23:39:15 +08:00
										 |  |  |             idd::DeviceClose(h_sw_device);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							| 
									
										
										
										
											2022-03-11 19:51:57 +08:00
										 |  |  |     }
 | 
					
						
							|  |  |  | }
 |