|
2 | 2 | //! executable that loaded the DLL. |
3 | 3 | use crate::{Result, output}; |
4 | 4 | use std::sync::Mutex; |
5 | | -use windows::Win32::Foundation::{HMODULE, TRUE}; |
6 | | -use windows::Win32::System::LibraryLoader::DisableThreadLibraryCalls; |
7 | | -use windows::Win32::System::SystemServices::{DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH}; |
| 5 | +use windows::Win32::Foundation::{FALSE, GetLastError, HMODULE, TRUE}; |
| 6 | +use windows::Win32::System::SystemServices::DLL_PROCESS_ATTACH; |
| 7 | +use windows::Win32::System::Threading::{GetCurrentThread, QueueUserAPC}; |
8 | 8 |
|
9 | 9 | const VERSION: &str = env!("CARGO_PKG_VERSION"); |
10 | 10 |
|
11 | 11 | #[unsafe(no_mangle)] |
12 | 12 | #[allow(non_snake_case)] |
13 | 13 | extern "system" fn DllMain( |
14 | | - hlibmodule: HMODULE, |
| 14 | + _hlibmodule: HMODULE, |
15 | 15 | call_reason: u32, |
16 | 16 | _reserved: *mut std::ffi::c_void, |
17 | 17 | ) -> windows::core::BOOL { |
18 | 18 | match call_reason { |
19 | 19 | DLL_PROCESS_ATTACH => { |
20 | 20 | output!("DLL_PROCESS_ATTACH"); |
21 | | - // disable DLL_THREAD_ATTACH/DLL_THREAD_DETACH notifications, since |
22 | | - // we don't need them, and may help with spawning threads |
23 | | - let _ = unsafe { DisableThreadLibraryCalls(hlibmodule) }; |
24 | | - // it's unclear what is allowed to be done in DllMain. |
25 | | - // theoretically, even spawning a thread is not "recommended": |
26 | | - // https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-best-practices |
27 | | - // https://devblogs.microsoft.com/oldnewthing/20070904-00/?p=25283 |
28 | | - // however, we don't synchronize on the thread, so it's ok? |
29 | | - let _ = std::thread::spawn(load_fixup); |
| 21 | + let hthread = unsafe { GetCurrentThread() }; |
| 22 | + let res = unsafe { QueueUserAPC(Some(load_fixup), hthread, 0) }; |
| 23 | + if res == 0 { |
| 24 | + let e = unsafe { GetLastError() }.0; |
| 25 | + output!("QueueUserAPC failed: {e:08x}"); |
| 26 | + FALSE |
| 27 | + } else { |
| 28 | + TRUE |
| 29 | + } |
30 | 30 | } |
31 | | - DLL_PROCESS_DETACH => (), |
32 | | - _ => (), |
| 31 | + _ => TRUE, |
33 | 32 | } |
34 | | - TRUE |
35 | 33 | } |
36 | 34 |
|
37 | | -fn load_fixup() { |
| 35 | +unsafe extern "system" fn load_fixup(_data: usize) { |
38 | 36 | if let Err(e) = load_fixup_inner() { |
39 | 37 | output!("FATAL error when loading fixup: {:?}", e); |
40 | 38 | } |
|
0 commit comments