| 1 | /* |
| 2 | * Copyright (C) 2023, Greg Manning <gmanning@rapitasystems.com> |
| 3 | * |
| 4 | * This hook, __pfnDliFailureHook2, is documented in the microsoft documentation here: |
| 5 | * https://learn.microsoft.com/en-us/cpp/build/reference/error-handling-and-notification |
| 6 | * It gets called when a delay-loaded DLL encounters various errors. |
| 7 | * We handle the specific case of a DLL looking for a "qemu.exe", |
| 8 | * and give it the running executable (regardless of what it is named). |
| 9 | * |
| 10 | * This work is licensed under the terms of the GNU LGPL, version 2 or later. |
| 11 | * See the COPYING.LIB file in the top-level directory. |
| 12 | */ |
| 13 | |
| 14 | #include <windows.h> |
| 15 | #include <delayimp.h> |
| 16 | |
| 17 | FARPROC WINAPI dll_failure_hook(unsigned dliNotify, PDelayLoadInfo pdli); |
| 18 | |
| 19 | |
| 20 | PfnDliHook __pfnDliFailureHook2 = dll_failure_hook; |
| 21 | |
| 22 | FARPROC WINAPI dll_failure_hook(unsigned dliNotify, PDelayLoadInfo pdli) { |
| 23 | if (dliNotify == dliFailLoadLib) { |
| 24 | /* If the failing request was for qemu.exe, ... */ |
| 25 | if (strcmp(pdli->szDll, "qemu.exe") == 0) { |
| 26 | /* Then pass back a pointer to the top level module. */ |
| 27 | HMODULE top = GetModuleHandle(NULL); |
| 28 | return (FARPROC) top; |
| 29 | } |
| 30 | } |
| 31 | /* Otherwise we can't do anything special. */ |
| 32 | return 0; |
| 33 | } |
| 34 |