는 방법을 테스트할 수 있습니 Windows DLL 파일을 결정하는 경우 그것은 32 비트 또는 64 비트?[중복]

StackOverflow https://stackoverflow.com/questions/495244

  •  20-08-2019
  •  | 
  •  

문제

이 질문은 이미 있는 대답을 여기:

고 싶은 테스트를 작성하는 스크립트 또는 프로그램을 주장하는 모든 DLL 파일에서 지정된 디렉토리의 특정 빌드를 입력.

내가 사용하는 것으로 이것을 정신을 확인의 끝에서 빌드 프로세스에 SDK 에는지 확인하는 64 비트 버전지 않은지 어떻게든 가지고 몇 가지 32-bit DLL 파일이며,그 반대입니다.

이 있는 쉬운 방법을 살펴 DLL 파일을 결정하는 형식?

이 솔루션 모두에서 작동 xp32 및 xp64.

도움이 되었습니까?

해결책

gory 세부 사항

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)

이 정보는 파일에서 고정 된 오프셋이어야하지만 파일을 가로 지르고 MS-DOS 헤더 및 image_nt_headers의 서명을 확인하여 향후 변경 사항에 대처하는 것이 좋습니다.

ImageHelp를 사용하여 헤더를 읽으십시오 ...

당신은 또한 사용할 수 있습니다 ImageHelp API 이렇게하려면 DLL을로드하십시오 로드 디지 그리고 당신은 얻을 수 있습니다 loaded_image Image_nt_headers 구조에 대한 포인터를 포함하는 구조. loaded_image를 imageUnload로 처리하십시오.

... 또는이 거친 Perl 스크립트를 조정하십시오

다음은 작업을 완료하는 거친 Perl 스크립트입니다. 파일에 dos 헤더가 있는지 확인한 다음 image_dos_header 60 바이트에서 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);

다른 팁

원유 방법으로 호출하는 것입 dumpbin 가진 헤더에서 옵션을 Visual Studio 도구에서 각 DLL 고 적절한 출력:

dumpbin /headers my32bit.dll

PE signature found

File Type: DLL

FILE HEADER VALUES
             14C machine (x86)
               1 number of sections
        45499E0A time date stamp Thu Nov 02 03:28:10 2006
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
            2102 characteristics
                   Executable
                   32 bit word machine
                   DLL

OPTIONAL HEADER VALUES
             10B magic # (PE32)

당신이 볼 수있는 몇 가지 단서에서는 출력이 32 비트 DLL 등 14C 가치가 바울이 언급하고있다.쉽게 해야에서 찾을 스크립트입니다.

당신이 가지고 있다면 Cygwin 설치 (여러 가지 이유로 강력히 권장) DLL에서 '파일'유틸리티를 사용할 수 있습니다.

file <filename>

다음과 같은 출력을 제공합니다.

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

의존성 워커는 모든 것을 (거의 거의) 알려줍니다.http://www.dependencywalker.com/

"설치"하지 않습니다. 모든 X32 또는 X64 Windows 모듈 | 응용 프로그램에서 작동합니다.

내가 기억하는 것처럼 모든 종속성, 즉 DLL 모듈, 그리고 Appl 이후를 보는 것이 매우 간단합니다. 종속성의 합은 x64, x32 (x86) 또는 각각인지 확인할 수있는 종속성의 합입니다.

모듈이 제작 된 CPU의 유형은 "CPU"열에 있습니다. 대부분의 64 비트 AP는 여전히 각각 비록 32 비트 AP w/b 모두 x86입니다.

괴짜/프로그래머를위한 아름다운 프로그램이며 무료입니다 ...

나는 정확히 그 일을하는 매우 간단한 도구를 작성했습니다.

간단히 발사하고 DLL 파일을로드하십시오.

enter image description here

위의 예에서로드 된 DLL은 32 비트입니다.

여기에서 다운로드 할 수 있습니다 (64 비트 버전 컴파일 ATM 만 있습니다).
http://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exe

이전 32 비트 버전은 다음과 같습니다.
http://dl.dropbox.com/u/31080052/pedeconstructor.zip

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top