diff --git a/libs/virtual_display/examples/idd_controller.rs b/libs/virtual_display/examples/idd_controller.rs index 98e2c2b44..92710ddf9 100644 --- a/libs/virtual_display/examples/idd_controller.rs +++ b/libs/virtual_display/examples/idd_controller.rs @@ -2,7 +2,7 @@ use virtual_display::win10::{idd, DRIVER_INSTALL_PATH}; use std::{ - ffi::{CStr, CString}, + ffi::CStr, io::{self, Read}, path::Path, }; @@ -59,19 +59,27 @@ unsafe fn plug_out(index: idd::UINT) { fn main() { let abs_path = Path::new(DRIVER_INSTALL_PATH).canonicalize().unwrap(); - let full_inf_path = abs_path.to_str().unwrap(); unsafe { let invalid_device = 0 as idd::HSWDEVICE; let mut h_sw_device = invalid_device; - let full_inf_path = CString::new(full_inf_path).unwrap().into_raw(); + + let full_inf_path: Vec = abs_path + .to_string_lossy() + .as_ref() + .encode_utf16() + .chain(Some(0).into_iter()) + .collect(); + loop { match prompt_input() as char { 'x' => break, 'i' => { - println!("Install or update driver begin"); + println!("Install or update driver begin, {}", abs_path.display()); let mut reboot_required = idd::FALSE; - if idd::InstallUpdate(full_inf_path, &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!( @@ -85,9 +93,11 @@ fn main() { } } 'u' => { - println!("Uninstall driver begin"); + println!("Uninstall driver begin {}", abs_path.display()); let mut reboot_required = idd::FALSE; - if idd::Uninstall(full_inf_path, &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!( @@ -129,9 +139,6 @@ fn main() { _ => {} } } - if !full_inf_path.is_null() { - let _ = CString::from_raw(full_inf_path); - } idd::DeviceClose(h_sw_device); } diff --git a/libs/virtual_display/src/lib.rs b/libs/virtual_display/src/lib.rs index 73b4bdbd4..9f71fd6da 100644 --- a/libs/virtual_display/src/lib.rs +++ b/libs/virtual_display/src/lib.rs @@ -2,7 +2,7 @@ pub mod win10; use hbb_common::{bail, lazy_static, ResultType}; -use std::{ffi::CString, path::Path, sync::Mutex}; +use std::{path::Path, sync::Mutex}; lazy_static::lazy_static! { // If device is uninstalled though "Device Manager" Window. @@ -33,16 +33,24 @@ pub fn install_update_driver(_reboot_required: &mut bool) -> ResultType<()> { bail!("{} not exists", install_path) } - let _full_install_path = match abs_path.to_str() { - Some(p) => CString::new(p)?.into_raw(), - None => bail!("{} not exists", install_path), - }; - #[cfg(windows)] unsafe { { + // Device must be created before install driver. + // https://github.com/fufesou/RustDeskIddDriver/issues/1 + if let Err(e) = create_device() { + bail!("{}", e); + } + + let full_install_path: Vec = abs_path + .to_string_lossy() + .as_ref() + .encode_utf16() + .chain(Some(0).into_iter()) + .collect(); + let mut reboot_required_tmp = win10::idd::FALSE; - if win10::idd::InstallUpdate(_full_install_path, &mut reboot_required_tmp) + if win10::idd::InstallUpdate(full_install_path.as_ptr() as _, &mut reboot_required_tmp) == win10::idd::FALSE { bail!("{}", win10::get_last_msg()?); @@ -65,16 +73,18 @@ pub fn uninstall_driver(_reboot_required: &mut bool) -> ResultType<()> { bail!("{} not exists", install_path) } - let _full_install_path = match abs_path.to_str() { - Some(p) => CString::new(p)?.into_raw(), - None => bail!("{} not exists", install_path), - }; - #[cfg(windows)] unsafe { { + let full_install_path: Vec = abs_path + .to_string_lossy() + .as_ref() + .encode_utf16() + .chain(Some(0).into_iter()) + .collect(); + let mut reboot_required_tmp = win10::idd::FALSE; - if win10::idd::Uninstall(_full_install_path, &mut reboot_required_tmp) + if win10::idd::Uninstall(full_install_path.as_ptr() as _, &mut reboot_required_tmp) == win10::idd::FALSE { bail!("{}", win10::get_last_msg()?); diff --git a/libs/virtual_display/src/win10/IddController.c b/libs/virtual_display/src/win10/IddController.c index dd18a622d..a30fa9d0a 100644 --- a/libs/virtual_display/src/win10/IddController.c +++ b/libs/virtual_display/src/win10/IddController.c @@ -64,14 +64,14 @@ const char* GetLastMsg() return g_lastMsg; } -BOOL InstallUpdate(LPCTSTR fullInfPath, PBOOL rebootRequired) +BOOL InstallUpdate(LPCWSTR fullInfPath, PBOOL rebootRequired) { SetLastMsg("Sucess"); - // UpdateDriverForPlugAndPlayDevices may return FALSE while driver was successfully installed... - if (FALSE == UpdateDriverForPlugAndPlayDevices( + // UpdateDriverForPlugAndPlayDevicesW may return FALSE while driver was successfully installed... + if (FALSE == UpdateDriverForPlugAndPlayDevicesW( NULL, - _T("RustDeskIddDriver"), // match hardware id in the inf file + L"RustDeskIddDriver", // match hardware id in the inf file fullInfPath, INSTALLFLAG_FORCE // | INSTALLFLAG_NONINTERACTIVE // INSTALLFLAG_NONINTERACTIVE may cause error 0xe0000247 @@ -82,7 +82,7 @@ BOOL InstallUpdate(LPCTSTR fullInfPath, PBOOL rebootRequired) DWORD error = GetLastError(); if (error != 0) { - SetLastMsg("UpdateDriverForPlugAndPlayDevices failed, last error 0x%x\n", error); + SetLastMsg("UpdateDriverForPlugAndPlayDevicesW failed, last error 0x%x\n", error); if (g_printMsg) { printf(g_lastMsg); @@ -94,11 +94,11 @@ BOOL InstallUpdate(LPCTSTR fullInfPath, PBOOL rebootRequired) return TRUE; } -BOOL Uninstall(LPCTSTR fullInfPath, PBOOL rebootRequired) +BOOL Uninstall(LPCWSTR fullInfPath, PBOOL rebootRequired) { SetLastMsg("Sucess"); - if (FALSE == DiUninstallDriver( + if (FALSE == DiUninstallDriverW( NULL, fullInfPath, 0, @@ -108,7 +108,7 @@ BOOL Uninstall(LPCTSTR fullInfPath, PBOOL rebootRequired) DWORD error = GetLastError(); if (error != 0) { - SetLastMsg("DiUninstallDriver failed, last error 0x%x\n", error); + SetLastMsg("DiUninstallDriverW failed, last error 0x%x\n", error); if (g_printMsg) { printf(g_lastMsg);