Winapi 获取已加载DLL(Windows API)的版本

Winapi 获取已加载DLL(Windows API)的版本,winapi,dll,version,loadlibrary,Winapi,Dll,Version,Loadlibrary,好的,在加载之前获取dll的文件版本很容易。我使用GetFileVersionInfo+GetFileVersionInfo+VerQueryValue,它就像一个符咒 但是如果dll已经加载了呢?我知道你可以使用LoadLibrary+IMAGE\u DOS\u HEADER+IMAGE\u NT\u HEADER来检索某些信息,如函数名等。我注意到IMAGE\u OPTIONAL\u HEADER有不同的版本字段,如MajorImageVersion和MinorImageVersion等。我

好的,在加载之前获取dll的文件版本很容易。我使用GetFileVersionInfo+GetFileVersionInfo+VerQueryValue,它就像一个符咒


但是如果dll已经加载了呢?我知道你可以使用LoadLibrary+IMAGE\u DOS\u HEADER+IMAGE\u NT\u HEADER来检索某些信息,如函数名等。我注意到IMAGE\u OPTIONAL\u HEADER有不同的版本字段,如MajorImageVersion和MinorImageVersion等。我几乎尝试了所有方法,但这些字段并不总是设置好的,当设置好时,它们与GetFileVersionInfo返回的值不匹配。所以我猜我找错地方了。有什么想法吗?

加载DLL后,您可以执行以下操作:

  • 使用
    GetModuleHandle()
    获取DLL的句柄

  • 将该句柄与
    FindResource()
    /
    LoadResource()
    /
    LockResource()
    一起使用,以访问DLL的
    RT\u版本
    资源数据

  • 将该资源数据复制到您分配的内存块中(很重要!)。使用
    SizeofResource()
    了解要分配和复制的字节数

  • 将该内存块传递到
    VerQueryValue()
    以访问其
    VS\u FIXEDFILEINFO
    结构,该结构包含DLL的版本号


  • 步骤3很重要,因为
    VerQueryValue()
    需要访问可写内存(它依赖于内存内容中的各种修复)。
    LockResource()
    返回的内存指针指向只读内存。如果试图直接使用资源指针,
    VerQueryValue()
    将崩溃。

    加载DLL后,可以执行以下操作:

  • 使用
    GetModuleHandle()
    获取DLL的句柄

  • 将该句柄与
    FindResource()
    /
    LoadResource()
    /
    LockResource()
    一起使用,以访问DLL的
    RT\u版本
    资源数据

  • 将该资源数据复制到您分配的内存块中(很重要!)。使用
    SizeofResource()
    了解要分配和复制的字节数

  • 将该内存块传递到
    VerQueryValue()
    以访问其
    VS\u FIXEDFILEINFO
    结构,该结构包含DLL的版本号



  • 步骤3很重要,因为
    VerQueryValue()
    需要访问可写内存(它依赖于内存内容中的各种修复)。
    LockResource()
    返回的内存指针指向只读内存。如果试图直接使用资源指针,
    VerQueryValue()
    将崩溃。

    GetModuleFileName
    将提供文件名<代码>加载库如果您不知道加载的dll的HMODULE,请先执行。谁说了文件名?我正在尝试获取已加载dll的文件版本。获得名称后,您可以使用您已有的任何
    GetFileVersionInfo+GetFileVersionInfo+VerQueryValue
    代码。就获取版本信息而言,是否已经加载了.dll并不重要。是的,我刚刚得到了你想要说的内容,正要编辑我的评论。我已经知道文件名,所以调用GetFileVersionInfo不会有问题。但这不是我想要的解决办法。加载dll时,其所有信息都已存储在内存中。我正在试图找出在内存中哪里可以找到文件版本信息。但也许我错了,也许你不能通过简单地使用图像标题等来访问它。一旦加载.dll,它已经映射到进程的内存空间,并且(其中一些)已经从磁盘读取。一旦您通过
    GetFileVersionInfo
    访问同一个文件,它将命中同一个内存缓存,因此以正式方式进行访问几乎不会受到任何惩罚。
    GetModuleFileName
    将为您提供文件名<代码>加载库如果您不知道加载的dll的HMODULE,请先执行。谁说了文件名?我正在尝试获取已加载dll的文件版本。获得名称后,您可以使用您已有的任何
    GetFileVersionInfo+GetFileVersionInfo+VerQueryValue
    代码。就获取版本信息而言,是否已经加载了.dll并不重要。是的,我刚刚得到了你想要说的内容,正要编辑我的评论。我已经知道文件名,所以调用GetFileVersionInfo不会有问题。但这不是我想要的解决办法。加载dll时,其所有信息都已存储在内存中。我正在试图找出在内存中哪里可以找到文件版本信息。但也许我错了,也许你不能通过简单地使用图像标题等来访问它。一旦加载.dll,它已经映射到进程的内存空间,并且(其中一些)已经从磁盘读取。一旦您通过
    GetFileVersionInfo
    访问同一个文件,它将命中同一个内存缓存,因此以正式方式访问几乎不会受到任何惩罚。谢谢您的帮助。这听起来是个不错的方法。然而,我想知道是否有一个“更简单”的方法,而不需要额外的api调用。看起来您可以通过将IMAGE\u DIRECTORY\u ENTRY\u resource常量传递到IMAGE\u OPTIONAL\u头中的DataDirectory字段来访问资源数据。现在我要玩一玩,试着让它工作。使用我描述的技术比直接钻入PE头更简单、更安全。浏览体育是一件复杂的事情。是的,我知道,但我正试图更好地了解整个体育疯狂。如果你已经知道答案,这很容易,但我想我只是喜欢挑战自己。听起来你想探索PE文件。这方面有很多好文章。请随意阅读。但是请不要把这和你问的问题的答案混淆起来。这就是,很明显,没有什么不好的