VirtualAllocExを呼び出す必要があり、IntPtrを返します。 空のアドレスを取得するためにその関数を呼び出していますので、そこにコードキャブを書くことができます(これは別のプロセスです)。IntPtr to Uint32? C#
結果をUInt32に変換するにはどうすればできますか?最近、そのアドレスでWriteProcessMemory()を呼び出すことができますか?
VirtualAllocExを呼び出す必要があり、IntPtrを返します。 空のアドレスを取得するためにその関数を呼び出していますので、そこにコードキャブを書くことができます(これは別のプロセスです)。IntPtr to Uint32? C#
結果をUInt32に変換するにはどうすればできますか?最近、そのアドレスでWriteProcessMemory()を呼び出すことができますか?
あなたはちょうどそれを(uint)ptrでキャストすることができます私は信じています(もしうまくいかない場合は、まずptr.ToInt32()かToInt64()を試してみてください) UInt32の範囲がInt32より大きく、非負のInt64と同じであれば十分です。
Int32が64ビットアーキテクチャでどのように動作するかは不明ですが、 IntPtrの理由は、ポインタを格納するためのプラットフォームに依存しないの方法を提供することであるとして、ひどく私は想像する。
WriteProcessMemoryを呼び出すときは、UInt32ではなくアドレスに対してIntPtrを渡す必要があります(WriteProcessMemoryには整数ではなくポインタが必要です)。したがって、VirtualAllocExによって返されたIntPtrをUInt32に変換する必要はありません。
WriteProcessMemoryのためのあなたのDLLIMPORTが間違っている、それはのIntPtrとして定義する必要がありますので、ベースアドレスがポインタである。
DllImportステートメントを修正する必要があります。
[DllImport( "kernel32.dll")] プライベート静的externブールWriteProcessMemory(IntPtr hProcess、uint lpBaseAddress、byte [] lpBuffer、int nSize、IntPtr lpNumberOfBytesWritten); いいえ私はそれを変更することはできません。私もVirtualQueryExを使用しています。これはuintを返します。IntPtrをUIntに変換できませんか? –
VirtualQueryExは、ポインタではなくブロックのサイズを返します。私は問題を見ることができません。 –
VirtualQueryExは、lpAddressパラメータのIntPtrも取得する必要があります。基本的にWin32でメモリハンドルが見える場合は、Int32またはUInt32ではなくIntPtr(ネイティブポインタータイプ)を考えるべきです。 32ビットプラットフォームでは、IntPtrとInt32/UInt32は同じなので、IntPtr.ToInt32を呼び出すか、UInt32にキャストできますが、IntPtrを一貫して使用しないのはなぜですか?それはより移植性があり、より意図的であることが明らかです。 – itowlson