Определите, равняется ли исполняемый файл (или библиотека) 32 - или 64 бита (в Windows)

Стратегическая модель позволяет Вам полиморфно изменять поведение класса.

шаблон "фабрика" позволяет Вам инкапсулировать создание объекта.

Gary высказывает большое мнение. При использовании принципа кодирования к абстракциям, а не "сращиваниям" тогда, много шаблонов начинает быть похожим на вариации на тему.

9
задан Reinstate Monica 28 December 2009 в 03:50
поделиться

2 ответа

API Windows для этого - GetBinaryType . Вы можете вызвать это из Python, используя pywin32 :

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

Если вы хотите сделать это без pywin32, вам придется самому прочитать PE-заголовок . Вот пример на C #, а вот быстрый перенос на 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()
21
ответ дан 4 December 2019 в 08:01
поделиться

Если вы используете Python 2.5 или новее в Windows, вы также можете использовать Windows API без pywin32, используя 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

Затем используйте GetBinaryType так же, как и с win32file.GetBinaryType.

Обратите внимание, что вам придется реализовать handle_nonzero_success, который в основном генерирует исключение, если возвращаемое значение равно 0.

5
ответ дан 4 December 2019 в 08:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: