一般に、C#に固有のことは何もしていませんが、基本的なCポインター演算を行っています。
データのブロックを歩き回り、データ型間の変換を実行する最も簡単な方法は、com.sun.jna.Memory
ではなくを使用することですbyte[]
。を使用Pointer.share(long offset)
してポインタ演算を実行できます(結果は、要求された量だけオフセットされた元のポインタです)。Pointer.write()
さまざまなバリアントまたはバリアントを使用して、ネイティブメモリの読み取りと書き込みを行うことができますPointer.readXXX()
。
ベースアドレスとしてを使用してJava側のStructure
オブジェクトを初期化できますが、ネイティブメモリをJavaに同期Pointer
するために明示的に呼び出すことを忘れないでください。Structure.read()
あなたのペーストからのいくつかの例:
Memory data = ...;
// mzH = *(MZHeader*) dPtr;
MZHeader mzH = new MZHeader(data);
mzH.read(); // or put this in the MZHeader(Pointer) ctor
// peH = *(PE_Header*)&dPtr[mzH.offsetToPE];
PE_Header peH = new PE_Header(data.share(mzH.offsetToPE));
peH.read(); // or put this in the PE_Header(Pointer) ctor
// peXH = *(PE_ExtHeader*)&dPtr[mzH.offsetToPE + sizeof(PE_Header)];
PE_ExtHeader peXH = new PE_ExtHeader(data.share(mzH.offsetToPE + peH.size()));
peXH.read(); // or put this in the PE_ExtHeader(Pointer) actor
そこからアイデアが浮かぶと思います...
編集
Pointer p = new Memory();
byte[] data = ...;
// Copy into Memory from data
p.write(0, data, 0, data.length);
// Copy out of Memory into data
p.read(0, data, 0, data.length);