kernel32是否总是从System32加载?
这似乎与我一直认为是DLL的默认行为相矛盾,那就是先从本地应用程序目录加载,如果它没有从PATH环境变量加载。 但是,对于某些DLL(如ntdll或kernel32),Windows总是首先检查System32。 这是预期的行为? 它可以被覆盖吗?
(我意识到重写这将是不好的做法,但想知道它是否真的可行,科学!)
Windows中的KnownDLLs功能可以帮助加载常见DLL,但它也会强制列表中的所有DLL从system32加载。
最重要的是,kernel32.dll和ntdll.dll在大多数版本的Windows中都有特殊的处理,并且在CreateProcess内部尽早加载,因为usermode进程的真正入口位于其中一个模块中。
您可以使用.local和清单重定向来覆盖其中的一些。
经过更多研究后,我发现某些DLL如kernel32.dll或user32.dll不能被正常覆盖的原因是因为它们是已知的DLL - Windows有一个像这些常用的DLL列表,它们自动默认为System32版本,而比首先检查应用程序的文件夹的默认行为。
如果您想要解决此问题,例如制作代理DLL,则需要在应用程序目录中包含两个文件:applicationName.exe.local和applicationName.exe.manifest,其中applicationName是您的EXE文件的名称。
这些需要是清单文件的内容:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" name="redirector" type="win32" />
<file name="kernel32.dll" />
</assembly>
assemblyIdentity标签旨在提供有关应用程序版本号和名称的信息,但我们基本上可以忽略它。 重要的部分是指定要在本地加载的文件的文件标签。 将kernel32.dll
替换为您想在本地加载的DLL。
此外,Windows只会在重新启动时或在EXE文件被修改时刷新.manifest文件的内容,因此您可以在某个十六进制编辑器中打开EXE文件,擦除第一个字符并将其添加回并保存...等。刷新清单文件。 如果你清单文件似乎被忽略,这样做。
上一篇: Does kernel32 always load from System32?
下一篇: Unable to find an entry point named '' in DLL 'cvextern'