2

64 ビット オペレーティング システムでシステム全体のフック (SetWindowHook を使用) を実行したいと考えています。

64 ビット プロセス (= proc64) は 64 ビット dll (= dll64) のみをロードでき、32 ビット プロセス (= proc32) は 32 ビット dll (= dll32) のみをロードできることがわかっています。

現在、私は SetWindowHook を 2 回呼び出すことを計画しています。1 回は dll32 で、もう 1 回は dll64 で、proc64s が dll64 をロードし、proc32s が dll32 をロードすることを期待しています (proc64s の dll32 と proc32s の dll64 は失敗します)。

それは正しい方法ですか、それとも「より正しい」方法はありますか?

ありがとう!:-)

4

3 に答える 3

1

あなたが説明したアプローチは正しく、文書化されています。

http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspxから:

SetWindowsHookExDLL を別のプロセスに挿入するために使用できます。32 ビット DLL を 64 ビット プロセスに挿入することはできず、64 ビット DLL を 32 ビット プロセスに挿入することもできません。アプリケーションが他のプロセスでフックを使用する必要がある場合、32 ビット アプリケーションは SetWindowsHookEx を呼び出して 32 ビット DLL を 32 ビット プロセスに挿入し、64 ビット アプリケーションは SetWindowsHookEx を呼び出して 64 ビット DLL を挿入する必要があります。 DLL を 64 ビット プロセスに変換します。32 ビット DLL と 64 ビット DLL は異なる名前にする必要があります。

32 ビットと 64 ビットの DLL の名前は異なる必要があるという最後のステートメントに注意してください。

于 2011-02-28T07:43:34.493 に答える
0

おそらく、 EasyHookを調べて、さまざまなトラブルを回避したいと思うでしょう。

于 2011-02-28T09:54:38.837 に答える
-3

コード内でマシンをテストして、語長が 32 ビットか 64 ビットかを確認する必要があります。64 ビット マシンは、語長を拡張することによって 32 ビット命令セットを処理しますが、64 ビット命令セットを渡される 32 ビット マシンは、本当に悪いことを引き起こす可能性があります。

C 標準ライブラリの limits.h ヘッダーでは、INT_MAX で最大サイズが得られます。テストして確認してください。

bool is32 = true;

if ( INT_MAX == 2^63 − 1 ) {
  is32 = false;
}

フラグを取得すると、どのファイルを含めるかがわかり、フラグを使用してそれを含めることができます。

于 2011-02-28T07:24:17.107 に答える