2009-08-28 15 views

Odpowiedz

18

Interfejs API systemu Windows to GetBinaryType. Można nazwać to od Python przy użyciu pywin32:

import win32file 
type=GetBinaryType("myfile.exe") 
if type==win32file.SCS_32BIT_BINARY: 
    print "32 bit" 
# And so on 

Jeśli chcesz to zrobić bez pywin32, musisz odczytać PE header siebie. Oto an example w C#, a tutaj to szybki port Python:

import struct 

IMAGE_FILE_MACHINE_I386=332 
IMAGE_FILE_MACHINE_IA64=512 
IMAGE_FILE_MACHINE_AMD64=34404 

f=open("c:\windows\explorer.exe", "rb") 

s=f.read(2) 
if s!="MZ": 
    print "Not an EXE file" 
else: 
    f.seek(60) 
    s=f.read(4) 
    header_offset=struct.unpack("<L", s)[0] 
    f.seek(header_offset+4) 
    s=f.read(2) 
    machine=struct.unpack("<H", s)[0] 

    if machine==IMAGE_FILE_MACHINE_I386: 
     print "IA-32 (32-bit x86)" 
    elif machine==IMAGE_FILE_MACHINE_IA64: 
     print "IA-64 (Itanium)" 
    elif machine==IMAGE_FILE_MACHINE_AMD64: 
     print "AMD64 (64-bit x86)" 
    else: 
     print "Unknown architecture" 

f.close() 
+0

Byłoby miło, gdybym mógł uzyskać te informacje bez użycia modułu pywin32. – pkit

+1

Wystarczy edytować odpowiedź, aby pokazać, jak to zrobić bez pywin32. –

+0

@Martin. Dzięki za linki, zobaczę, czy mogę coś połączyć. – pkit

4

Jeśli używasz Pythona 2.5 lub nowszego w systemie Windows, można też użyć Windows API bez pywin32 za pomocą ctypes.

from ctypes import windll, POINTER 
from ctypes.wintypes import LPWSTR, DWORD, BOOL 

SCS_32BIT_BINARY = 0 # A 32-bit Windows-based application 
SCS_64BIT_BINARY = 6 # A 64-bit Windows-based application 
SCS_DOS_BINARY = 1 # An MS-DOS-based application 
SCS_OS216_BINARY = 5 # A 16-bit OS/2-based application 
SCS_PIF_BINARY = 3 # A PIF file that executes an MS-DOS-based application 
SCS_POSIX_BINARY = 4 # A POSIX-based application 
SCS_WOW_BINARY = 2 # A 16-bit Windows-based application 

_GetBinaryType = windll.kernel32.GetBinaryTypeW 
_GetBinaryType.argtypes = (LPWSTR, POINTER(DWORD)) 
_GetBinaryType.restype = BOOL 

def GetBinaryType(filepath): 
    res = DWORD() 
    handle_nonzero_success(_GetBinaryType(filepath, res)) 
    return res 

Następnie użyj GetBinaryType tak jak byś z win32file.GetBinaryType.

Uwaga, trzeba by wdrożyć handle_nonzero_success, które zasadniczo zgłasza wyjątek, jeśli zwracana jest wartość 0.

0

byłem w stanie wykorzystać odpowiedź Martin B z powodzeniem w Pythonie 3.5 programu po dokonaniu tej korekty:

s=f.read(2).decode(encoding="utf-8", errors="strict") 

Początkowo działało dobrze z moim programem w Pythonie 2.7, ale po wprowadzeniu innych niezbędnych zmian odkryłem, że robię b'MZ ', a dekodowanie wydaje się to naprawić.

Powiązane problemy