Как установить указатель c_char_p ctypes IronPython на абсолютный адрес, который не является допустимым адресом памяти для чтения? - PullRequest
0 голосов
/ 13 марта 2019

В IronPython 2.7.9 мне нужно установить c_char_p на абсолютный адрес 0xCAFEBABE. Этот «адрес» будет , а не действительным адресом памяти для чтения, но он действует как волшебное слово, чтобы вызвать что-то (вы можете прочитать историю, почему я должен использовать символ * без содержания в моем вопросе в ' Как мне вручную установить указатель c_char_p ctypes IronPython на абсолютный адрес? ', где исходный вопрос не был достаточно хорош для моей проблемы). Кроме того, мне разрешено использовать только 32-битную версию интерпретатора IronPython, поскольку мне нужно загрузить 32-битную DLL.

from ctypes import *
class MyStruct(Structure):
    _fields_ = [("config", c_char_p),
                ("magicnumber",  c_char_p)]

mystruct = MyStruct()
mystruct.config      = "my RS232 configuration"
mystruct.magicnumber = cast(0xCAFEBABE, c_char_p)

К сожалению, последнее назначение поднимает OverflowError. Другие реализации Python (CPyhton 2.x, CPython 3.x, PyPy & ActivePython, ...) могут выполнять эту работу без каких-либо проблем.

Назначение атрибута magicnumber должно состоять в том, что интерпретатор Python должен записать 32-битный адрес 0xCAFEBABE в правильный адрес памяти указателя внутри структуры (что могут делать многие другие дистрибутивы Python, кроме IronPython) .

Тесная связь IronPython с платформой .NET делает IronPython интересным для многих разработчиков, которые хотят использовать его в сочетании с другими языками .NET.

Может быть, эта задача невозможна с IronPython? Я был бы рад получить хотя бы надежный ответ. Заранее спасибо!

1 Ответ

0 голосов
/ 18 марта 2019

Чтобы получить общее решение этого вопроса для всех реализаций Python, мы должны не объявить атрибут структуры как его первоначальный тип c_char_p, а как c_uint.

Это подразумеваетчтобы обернуть доступ к этому атрибуту к функциям-обработчикам, которые должны заботиться об измененном типе.

Доступ на запись к этому атрибуту со строкой, поскольку аргумент должен выделить соответствующий буфер и сохранить строку в буфере.

Затем в этот атрибут c_uint записывается адрес буфера.Доступ на запись со специальным флагом 0xCAFEBABE может быть непосредственно записан в новый тип атрибута c_uint.

Доступ на чтение должен только возвращать содержимое буфера, поскольку данные передаются через этот атрибут в код Python.не предназначен для этого атрибута.

Это было проверено и работает безупречно.

...