我如何testingWindows DLL文件,以确定它是32位还是64位?

我想编写一个testing脚本或程序来声明给定目录中的所有DLL文件都是特定的构buildtypes。

我将在SDK的构build过程结束时将此用作完整性检查,以确保64位版本不会以某种方式获取某些32位DLL文件,反之亦然。

有没有一种简单的方法来查看一个DLL文件,并确定其types?

解决scheme应该可以在xp32和xp64上运行。

血淋淋的细节

一个DLL使用PE可执行格式,从文件中读取信息不是太棘手。

有关概述,请参阅有关PE文件格式的此MSDN文章 。 您需要阅读MS-DOS标题,然后阅读IMAGE_NT_HEADERS结构。 这包含IMAGE_FILE_HEADER结构,其中包含您在机器成员中需要的信息,其中包含以下值之一

  • IMAGE_FILE_MACHINE_I386(0x014c)
  • IMAGE_FILE_MACHINE_IA64(0x0200)
  • IMAGE_FILE_MACHINE_AMD64(0x8664)

这个信息应该在文件中的一个固定的偏移量,但我仍然build议遍历文件,并检查MS-DOS头和IMAGE_NT_HEADERS的签名,以确保您能够应对任何未来的变化。

使用ImageHelp来阅读标题…

您也可以使用ImageHelp API来执行此操作 – 使用LoadImage加载DLL,您将得到一个LOADED_IMAGE结构,其中将包含一个指向IMAGE_NT_HEADERS结构的指针。 用ImageUnload取消分配LOADED_IMAGE。

…或者修改这个粗糙的Perl脚本

这是粗糙的Perl脚本,完成工作。 它检查文件是否有DOS标头,然后从文件中读取60个字节的IMAGE_DOS_HEADER的PE偏移量。

然后,它寻找PE部分的开始,读取签名并检查它,然后提取我们感兴趣的值。

#!/usr/bin/perl # # usage: petype <exefile> # $exe = $ARGV[0]; open(EXE, $exe) or die "can't open $exe: $!"; binmode(EXE); if (read(EXE, $doshdr, 64)) { ($magic,$skip,$offset)=unpack('a2a58l', $doshdr); die("Not an executable") if ($magic ne 'MZ'); seek(EXE,$offset,SEEK_SET); if (read(EXE, $pehdr, 6)){ ($sig,$skip,$machine)=unpack('a2a2v', $pehdr); die("No a PE Executable") if ($sig ne 'PE'); if ($machine == 0x014c){ print "i386\n"; } elsif ($machine == 0x0200){ print "IA64\n"; } elsif ($machine == 0x8664){ print "AMD64\n"; } else{ printf("Unknown machine type 0x%lx\n", $machine); } } } close(EXE); 

一个粗糙的方法是从每个DLL上的Visual Studio工具的头文件选项调用dumpbin,并寻找合适的输出:

 dumpbin /头文件my32bit.dll

findPE签名

文件types:DLL

文件头值
              14C机器(x86)
                1个部分
         45499E0A时间date戳Thu Nov 02 03:28:10 2006
                0符号表的文件指针
                0个符号
               E0大小的可选标题
             2102特征
                   可执行文件
                    32位字机
                    DLL

可选的标题值
              10B魔术#(PE32)

你可以在输出中看到一些线索,它是一个32位的DLL,包括Paul提到的14C值。 应该很容易在脚本中查找。

如果你已经安装了Cygwin (我强烈推荐它有各种各样的原因),你可以在DLL上使用'file'工具

 file <filename> 

这将产生这样的输出:

 icuuc36.dll: MS-DOS executable PE for MS Windows (DLL) (GUI) Intel 80386 32-bit 

沃克的依赖性告诉所有(几乎)。 http://www.dependencywalker.com/

它不会“安装” – 只要得到它,解压缩并运行exec。 它适用于任何x32或x64窗口模块应用程序。

我记得,看到所有的依赖关系,即DLL模块,以及应用程序相当简单。 是一个可以确定它是完整的x64,x32(x86)还是每个都有的依赖关系的总和。

模块构build的CPUtypes位于“CPU”列中。 大多数64位API仍然是每一个,而不是所有的x86 32位AP。

美丽的程序为极客/程序员,它是免费的…

我已经写了一个非常简单的工具,就是所谓的PE Deconstructor。

只需启动它并加载您的DLL文件:

在这里输入图像描述

在上面的例子中,加载的DLL是32位的。

你可以在这里下载(我只有64位版本编译ATM):
http://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exe

以前的32位版本可以在这里find:
http://dl.dropbox.com/u/31080052/pedeconstructor.zip