我在。
现实世界解决方案
使用 LoadLibraryW ://codefromthe70s/mhook22.aspxrel =nofollow> Mhook 或 EasyHook 。你可以完全用你的自定义逻辑替换该调用。你可以在午饭之前完成这个,找到生活的意义。
I'm including python.h in my Visual C++ DLL file project which causes an implicit linking with python25.dll. However, I want to load a specific python25.dll (several can be present on the computer), so I created a very simple manifest file named test.manifest:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <file name="python25.dll" /> </assembly>And I'm merging it with the automatically embedded manifest file generated by Visual Studio thanks to:
Configuration Properties -> Manifest Tool -> Input and Output -> Additional Manifest Files -->$(ProjectDir)\src\test.manifestpython25.dll is now loaded twice: the one requested by the manifest, and the one that Windows should find through its search order.
Why is that happening and how can I just load the DLL file pointed by the manifest?
解决方案After exhaustive battle with WinSxS and DLL redirection, here's my advice for you:
Some backgroundVarious things can cause a DLL to be loaded under Windows:
- Explicit linking (LoadLibrary) -- the loader uses the current activation context of the running exe. This is intuitive.
- Implicit linking ("load time linkage", the "auto" ones) -- the loader uses the default activation context of the depending DLL. If A.exe depends on B.dll depends on C.dll (all implicit linkage), the loader will use B.dll's activation context when loading C.dll. IIRC, it means if B's DllMain loads C.dll, it can be using B.dll's activation context -- most of the time it means the system-wide default activation context. So you get your python DLL from %SystemRoot%.
- COM (CoCreateInstance) -- this is the nasty one. Extremely subtle. It turns out the loader can look up the full path of a DLL from registry using COM (under HKCR\CLSID). LoadLibrary will not do any searching if user gives it full path, so the activation context can't affect the DLL resolution. Those can be redirected with the comClass element and friends, see reference.
- Even though you have the correct manifest, sometimes someone can still change the activation context at run time using the Activation Context API. If this is the case, there is usually not much you can do about it (see the ultimate solution below), this is just here for completeness. If you want to find out who is messing with the activation context, WinDbg bp kernel32!ActivateActCtx.
Real world solution
Instead of fiddling with this WinSxS thing, try hooking LoadLibraryW using Mhook or EasyHook. You can just totally replace that call with your custom logic. You can finish this before lunch and find the meaning of life again.
更多推荐
DLL文件加载两次通过清单的DLL重定向
发布评论