IntPtr для Uint32? C # - PullRequest
       12

IntPtr для Uint32? C #

0 голосов
/ 25 апреля 2009

Мне нужно позвонить VirtualAllocEx , и он возвращает IntPtr. Я вызываю эту функцию, чтобы получить пустой адрес, чтобы я мог написать свою кодовую пещеру (это происходит в другом процессе).

Как мне преобразовать результат в UInt32, чтобы я мог вызывать WriteProcessMemory () в последнее время с этим адресом?

Ответы [ 3 ]

2 голосов
/ 25 апреля 2009

Когда вы вызываете WriteProcessMemory, вы должны передавать IntPtr для адреса, а не UInt32 (поскольку WriteProcessMemory ожидает указатель, а не целое число). Таким образом, вы должны иметь возможность использовать IntPtr, возвращенный VirtualAllocEx напрямую, без необходимости конвертировать его в UInt32.

1 голос
/ 25 апреля 2009

Вы можете просто разыграть его с (uint) ptr, я считаю (если он не разыгрывается красиво, сначала попробуйте ptr.ToInt32 () или ToInt64 (). По крайней мере, я не знаю никаких проблем с этим подходом, хотя я этим не пользовался, поскольку UInt32 имеет больший диапазон, чем Int32, и так же, как Int64 на неотрицательной стороне, он должен быть достаточно хорошим.

Хотя не уверен, как ведет себя Int32 на 64-битных архитектурах. Плохо было бы представить, что причиной IntPtr является независимый от платформы способ хранения указателей.

0 голосов
/ 25 апреля 2009

Ваш DLlImport для WriteProcessMemory неверен, базовый адрес является указателем, поэтому его следует определить как IntPtr.

* MSDN 1004 *

Вам нужно исправить заявление DllImport.

...