2011-12-16 15 views
2

共有メモリインターフェイス(SMI)を持つ32ビットプログラムを実行するWindows 7(64ビット)のコードを記述する必要があります。より正確には、私がコーディングしているプログラムはSMIに書き込み、32ビットプログラムはこのSMIから読み込みます。Windows 64ビットと32ビットの間の共有メモリインターフェイス

私が最初に抱える問題は、私が32ビットプログラムのソースコードにアクセスできないということです。解決できない問題です。第2の問題は、SMIが、書き込まれた情報のアドレスを記憶することである。この尖ったは、以下のコードを使用して、ベースポインタとして格納されている:

gpSharedBlock->m_pData[uiDataPointer] = (char __based(gpSharedBlock)*)pData; 

はpDataを我々が記述しているデータへのポインタであり、そしてgpSharedBlock-> m_pData [i]が格納されているI ^番目の要素を指しました。

恐らくここからあなたは既に問題に気付いています。 W32のポインタは4バイトであり、W64のポインタは8バイトである。次に、格納された値が64ビットのポインタであるため、32ビットのプログラムによって最後に読み取られた値は、望ましい値ではありません。

私の質問は、実行中のプログラムが正しい情報を読み込むように、64ビットアドレスを32ビットアドレスに変換する方法はありますか?

私はWOW64について読んでいますが、私はW32プログラムがその下で動作していると思いますが、それをどのように活用するのか分かりません。何か案は?

答えて

5

__basedポインタは、別のポインタからの数値オフセットです。事実上、実行時に解釈される仮想ポインタです。

ポインタは64ビットで8バイトなので、32ビットプログラムと互換性があるためには、64ビットコードでSharedBlock型のポインタメンバーを宣言して、代わりに4ビット整数を使用する必要がありますポインタ、例えばの:

struct sSharedBlock 
{ 
    int32_t m_pData[...]; 
}; 

pDatagpSharedBlock__basedので、pDataの値がgpSharedBlockの値からの相対オフセットです。このファクトを使用して、gpSharedBlockメモリブロックに対するデータブロックの実際のバイトオフセットを確認し、そのオフセット値を整数としてm_pData[]に格納します。これは、SMIメモリブロックが実際にはとにかく期待しているものです。オフセットであり、実際のポインタではありません。 __basedキーワードは、オフセット計算をコードで手動で行うことなく、ポインタを使用してオフセットを処理するための素晴らしい方法です。

元のコードが効果的に__basedキーワードを必要とせず、次のと同じです:良い答えと素晴らしいアバター用

gpSharedBlock->m_pData[uiDataPointer] = (int32_t) (((char*)pData) - ((char*)gpSharedBlock)); 
+0

+1 –

関連する問題