-1

Windows API を使用してメモリ情報を照会しようとしています。x86 と x64 の両方を対象にしたいと考えています。MEMORY_BASIC_INFORMATIONに関するドキュメントを読んだところ、ターゲットプロセスの「ビット数」に応じて異なるクエリを実行するには2つ必要であることがわかりました。

しかし、x86 プロセスを照会して MEMORY_BASIC_INFORMATION32 構造体を使用すると、システム エラー コード 24 が表示されます。これは、コマンドの長さが正しくないことを示しています。

しかし、MEMORY_BASIC_INFORMATION64 バージョンを使用すると、呼び出しは x86 プロセスと x64 プロセスの両方で機能します。それはどうした。それは、ドキュメントが私に言っていることを私が理解していることではありません。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa366775(v=vs.85).aspx

したがって、この動作はバージョン間で移植可能です。誰でもこの動作を説明できます。それとも、完全に台無しになっているのは私のシステムだけですか?

これは私が使用するコードです:

class Process {
     HANDLE m_handle;

     bool Process::query_impl(RemotePointer address, void *info, size_t size) {
           return VirtualQueryEx(m_handle, address.get(), (MEMORY_BASIC_INFORMATION*) info, size);
     }
public:

     bool Process::query(RemotePointer address, MEMORY_BASIC_INFORMATION64 &info) {
           return query_impl(address, &info, sizeof(MEMORY_BASIC_INFORMATION64));
     }

     bool Process::query(RemotePointer address,  MEMORY_BASIC_INFORMATION32 &info) {
           return query_impl(address, &info, sizeof(MEMORY_BASIC_INFORMATION32));
     }
}

よろしくお願いします。

4

1 に答える 1

0

ビット数が競合するプロセスのメモリとの対話は、これを含む多くの Windows API 関数の問題を表しています。x86 でコンパイルされた場合、VirtualQueryEx() は 4 バイトのポインターを受け取りますが、x86 プログラムから x64 プロセスで使用しようとすると、8 バイトのポインターを与えることができません。

何らかの方法で動作させたとしても、メモリの一番下の ~4GB しかクエリできません。

このため、最善の方法は、ビット数ごとに個別のバイナリをコンパイルし、MEMORY_BASIC_INFORMATION のみを使用して、マクロを使用して解決することです。

于 2020-04-02T00:37:45.283 に答える