如何链接API集合(*ms-win*)而不是kernel32.dll、ntdll.dll等



如何明确指定MSVC编译器/链接器链接API集(*ms-win*模式匹配dlls(,而不是kernel32.dllntdll.dll等。?

例如,我创建了一个简单的dll,它只调用一些基本的WinAPI。当检查它的IAT(通过CFF资源管理器、python pefile库等(时,只有kernel32.dll。我希望看到*ms-win*dll。

neneneba API集在内部使用,这意味着即使是Windows 7、8或10上的"遗留"系统DLL也会使用它们。因此,您没有理由直接使用它们。

也就是说,你可以使用许多"伞形"库,而不是针对经典的KERNEL32.DLL等进行链接:

  • onecore.lib
  • onecoreuap.lib
  • onecore_apiset.lib

请记住,这些软件旨在与它们附带的Windows 10 SDK匹配相同的Windows版本(即,它们是前向兼容的,而不是后向兼容的(。还有一些*_downlevel.lib版本也支持旧版本的Windows。根据微软文档,这些主要供驱动程序开发人员使用

UWP应用程序使用自己的伞形库WindowsApps.lib/WindowsApps_downlevel.lib

有关伞形库的详细信息,请参阅Microsoft文档。

请注意,不应链接多个伞形库,也不应在同一链接中将kernel32.lib与伞形库混合。对于WindowsApps.lib以外的场景,使用MSBuild默认规则实际上有点困难。VS 2022 17.2对此进行了改进。请参阅此VS反馈问题。

此外,由于Microsoft Visual C/C++运行时的一个怪癖,如果您使用onecore_apiset.lib链接,也应该使用/IGNOREDEFAULTLIB:onecore.lib /IGNOREDEFAULTLIB:kernel32.lib。使用/SUBSYSTEM:WINDOWS,10.0/SUBSYSTEM:CONSOLE,10.0也是一个好主意。请参阅此VS反馈问题。

相关内容

  • 没有找到相关文章

最新更新