2009-04-25 19 views
0

VirtualAllocExを呼び出す必要があり、IntPtrを返します。 空のアドレスを取得するためにその関数を呼び出していますので、そこにコードキャブを書くことができます(これは別のプロセスです)。IntPtr to Uint32? C#

結果をUInt32に変換するにはどうすればできますか?最近、そのアドレスでWriteProcessMemory()を呼び出すことができますか?

答えて

1

あなたはちょうどそれを(uint)ptrでキャストすることができます私は信じています(もしうまくいかない場合は、まずptr.ToInt32()かToInt64()を試してみてください) UInt32の範囲がInt32より大きく、非負のInt64と同じであれば十分です。

Int32が64ビットアーキテクチャでどのように動作するかは不明ですが、 IntPtrの理由は、ポインタを格納するためのプラットフォームに依存しないの方法を提供することであるとして、ひどく私は想像する。

2

WriteProcessMemoryを呼び出すときは、UInt32ではなくアドレスに対してIntPtrを渡す必要があります(WriteProcessMemoryには整数ではなくポインタが必要です)。したがって、VirtualAllocExによって返されたIntPtrをUInt32に変換する必要はありません。

+0

[DllImport( "kernel32.dll")] プライベート静的externブールWriteProcessMemory(IntPtr hProcess、uint lpBaseAddress、byte [] lpBuffer、int nSize、IntPtr lpNumberOfBytesWritten); いいえ私はそれを変更することはできません。私もVirtualQueryExを使用しています。これはuintを返します。IntPtrをUIntに変換できませんか? –

+0

VirtualQueryExは、ポインタではなくブロックのサイズを返します。私は問題を見ることができません。 –

+0

VirtualQueryExは、lpAddressパラメータのIntPtrも取得する必要があります。基本的にWin32でメモリハンドルが見える場合は、Int32またはUInt32ではなくIntPtr(ネイティブポインタータイプ)を考えるべきです。 32ビットプラットフォームでは、IntPtrとInt32/UInt32は同じなので、IntPtr.ToInt32を呼び出すか、UInt32にキャストできますが、IntPtrを一貫して使用しないのはなぜですか?それはより移植性があり、より意図的であることが明らかです。 – itowlson

0

WriteProcessMemoryのためのあなたのDLLIMPORTが間違っている、それはのIntPtrとして定義する必要がありますので、ベースアドレスがポインタである。

MSDN

DllImportステートメントを修正する必要があります。