mirror of
https://github.com/velopack/velopack.git
synced 2025-10-25 15:19:22 +00:00
Dynamically load SetDefaultDllDirectories
This commit is contained in:
@@ -1,4 +1,30 @@
|
|||||||
use windows::Win32::System::LibraryLoader::{SetDefaultDllDirectories, LOAD_LIBRARY_SEARCH_SYSTEM32};
|
use windows::Win32::System::LibraryLoader::LOAD_LIBRARY_SEARCH_SYSTEM32;
|
||||||
|
use windows::Win32::{Foundation::BOOL, System::LibraryLoader::LOAD_LIBRARY_FLAGS};
|
||||||
|
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
type SetDefaultDllDirectoriesFn = unsafe extern "system" fn(DirectoryFlags: u32) -> BOOL;
|
||||||
|
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
unsafe fn set_default_dll_directories(flags: LOAD_LIBRARY_FLAGS) {
|
||||||
|
if let Ok(lib) = libloading::Library::new("kernel32.dll") {
|
||||||
|
// Try to get the symbol (function pointer). If it fails, that means we're on an
|
||||||
|
// older version of Windows that does not export SetDefaultDllDirectories.
|
||||||
|
let func: libloading::Symbol<SetDefaultDllDirectoriesFn> = match lib.get(b"SetDefaultDllDirectories") {
|
||||||
|
Ok(s) => s,
|
||||||
|
Err(_e) => {
|
||||||
|
// Fallback or ignore if not available on older Windows
|
||||||
|
warn!("SetDefaultDllDirectories not available on this version of Windows.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if func(flags.0) == false {
|
||||||
|
warn!("Failed to set default DLL directories.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
warn!("Failed to load kernel32.dll.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// This attempts to defend against malicious DLLs that may sit alongside
|
/// This attempts to defend against malicious DLLs that may sit alongside
|
||||||
/// our binary in the user's download folder.
|
/// our binary in the user's download folder.
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
@@ -6,7 +32,8 @@ pub fn pre_main_sideload_mitigation() {
|
|||||||
// Default to loading delay loaded DLLs from the system directory.
|
// Default to loading delay loaded DLLs from the system directory.
|
||||||
// For DLLs loaded at load time, this relies on the `delayload` linker flag.
|
// For DLLs loaded at load time, this relies on the `delayload` linker flag.
|
||||||
// This is only necessary prior to Windows 10 RS1. See build.rs for details.
|
// This is only necessary prior to Windows 10 RS1. See build.rs for details.
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let _ = SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32);
|
set_default_dll_directories(LOAD_LIBRARY_SEARCH_SYSTEM32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user