【发布时间】:2015-12-18 03:14:02
【问题描述】:
好的,在加载之前获取 dll 的文件版本很容易。我正在使用 GetFileVersionInfoSize + GetFileVersionInfo + VerQueryValue,它就像一个魅力。
但是如果 dll 已经加载了怎么办?我知道您可以使用 LoadLibrary + IMAGE_DOS_HEADER + IMAGE_NT_HEADERS 来检索某些信息,例如函数名称等。我注意到 IMAGE_OPTIONAL_HEADER 具有不同的版本字段,例如 MajorImageVersion 和 MinorImageVersion 等。我尝试了几乎所有内容,但这些字段并不总是设置和当它们存在时,它们与 GetFileVersionInfo 返回的值不匹配。所以我猜我找错地方了。有什么想法吗?
【问题讨论】:
-
GetModuleFileName会给你文件名。LoadLibrary首先如果你不知道加载的dll的HMODULE。 -
谁说过文件名?我正在尝试获取已加载的 dll 的文件版本。
-
一旦你有了名字,你就可以使用你已经拥有的任何
GetFileVersionInfoSize + GetFileVersionInfo + VerQueryValue代码。就获取版本信息而言,.dll 是否已经加载并不重要。 -
是的,我刚刚明白你想说的话,正准备编辑我的评论。我已经知道文件名,所以调用 GetFileVersionInfo 不会有问题。但这不是我正在寻找的解决方案。加载 dll 时,其所有信息都已存储在内存中。我试图找出在内存中哪里可以找到文件版本信息。但也许我错了,也许你不能通过简单地使用 IMAGE_NT_HEADERS 等来访问它。
-
加载 .dll 后,它已经被映射到进程的内存空间,并且(其中一些)已经从磁盘读取。一旦您通过
GetFileVersionInfo访问同一个文件,它将访问相同的内存缓存,因此以官方方式执行此操作几乎不会受到任何惩罚。
标签: winapi dll version loadlibrary