Enforce VirtualAllo c адрес менее 32 бит на 64-битной машине - PullRequest
0 голосов
/ 04 мая 2020

Мне нужно выделить определенное место в памяти, и я использовал для этого VirtualAlloc. Однако я все чаще замечаю, что VirtualAlloc возвращает адрес, который превышает 32 бита, хотя всегда меньше 33 бит. В результате, когда я копирую данные на этот адрес памяти, компьютер падает на BSOD.

Я использую 64-битный windows и 64-битный Python. Я подозреваю, что программа, которая копирует данные в память, оборудована только для обработки 32 бит. Есть ли способ заставить VirtualAlloc предоставлять адрес в пределах 32 бит?

Я использую Python, в частности пакет ctypes для вызова VirtualAlloc, см. Код ниже. Многократное выполнение этого кода меняет адрес, поэтому повторный вызов указанной ниже функции в конечном итоге приведет к получению адреса ниже 32 бит. Тем не менее, я ищу причину и надежное решение проблемы. Любая помощь будет принята с благодарностью.

import ctypes
mem_commit = 0x1000
page_readwrite = 0x4
size_bytes = 200000  # Allocation sizes are usually around this value

ctypes.windll.kernel32.VirtualAlloc.argtypes = [
    ctypes.c_void_p, ctypes.c_long, ctypes.c_long, ctypes.c_long]
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_int

addr = ctypes.windll.kernel32.VirtualAlloc(
    0, ctypes.c_long(size_bytes), mem_commit, page_readwrite)    

Обратите внимание, что впоследствии я освобождаю память, используя VirtualFree.

...