mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-31 04:06:46 +00:00 
			
		
		
		
	 330fe3b03f
			
		
	
	
		330fe3b03f
		
	
	
	
	
		
			
			Generate a qemu_plugin_api.lib delay import lib on windows, for windows qemu plugins to link against. Implement an example dll load fail hook to link up the API functions correctly when a plugin is loaded on windows. Update the build scripts for the test and example plugins to use these things. Signed-off-by: Greg Manning <gmanning@rapitasystems.com> Acked-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20231102172053.17692-3-gmanning@rapitasystems.com> [AJB: use find_program for dlltool, s/Windows/windows/] Cc: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20231106185112.2755262-15-alex.bennee@linaro.org>
		
			
				
	
	
		
			35 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2023, Greg Manning <gmanning@rapitasystems.com>
 | |
|  *
 | |
|  * This hook, __pfnDliFailureHook2, is documented in the microsoft documentation here:
 | |
|  * https://learn.microsoft.com/en-us/cpp/build/reference/error-handling-and-notification
 | |
|  * It gets called when a delay-loaded DLL encounters various errors.
 | |
|  * We handle the specific case of a DLL looking for a "qemu.exe",
 | |
|  * and give it the running executable (regardless of what it is named).
 | |
|  *
 | |
|  * This work is licensed under the terms of the GNU LGPL, version 2 or later.
 | |
|  * See the COPYING.LIB file in the top-level directory.
 | |
|  */
 | |
| 
 | |
| #include <windows.h>
 | |
| #include <delayimp.h>
 | |
| 
 | |
| FARPROC WINAPI dll_failure_hook(unsigned dliNotify, PDelayLoadInfo pdli);
 | |
| 
 | |
| 
 | |
| PfnDliHook __pfnDliFailureHook2 = dll_failure_hook;
 | |
| 
 | |
| FARPROC WINAPI dll_failure_hook(unsigned dliNotify, PDelayLoadInfo pdli) {
 | |
|     if (dliNotify == dliFailLoadLib) {
 | |
|         /* If the failing request was for qemu.exe, ... */
 | |
|         if (strcmp(pdli->szDll, "qemu.exe") == 0) {
 | |
|             /* Then pass back a pointer to the top level module. */
 | |
|             HMODULE top = GetModuleHandle(NULL);
 | |
|             return (FARPROC) top;
 | |
|         }
 | |
|     }
 | |
|     /* Otherwise we can't do anything special. */
 | |
|     return 0;
 | |
| }
 | |
| 
 |