1

C++ で基本的なデバッガーを作成しています。デバッガ プロセスから、デバッグされたプロセスのロード済みモジュールのリストを取得しようとしています。私のOSは64ビットのWindows 7ですが、デバッガーとデバッグ対象の両方が32ビットでコンパイルされています(タスクマネージャーで見ると、名前の横に* 32が付いています)。

デバッガーからデバッグ対象で CreateToolhelpSnapshot を呼び出そうとすると、常に 299 エラーが発生します。MSDN によると、これは 32 ビットから 64 ビット プロセスをクエリする場合、またはその逆の場合にのみ発生するはずです。私の知る限り、私のプロセスは両方とも32ビットです。

ここに私のスナップショットコードがあります:

HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE32, pid);
if( hModuleSnap == INVALID_HANDLE_VALUE )
{
    std::cout << "CreateToolhelp32Snapshot Error: " << GetLastError() << std::endl;
}
4

1 に答える 1

0

TH32CS_SNAPMODULEの代わりに使用しTH32CS_SNAPMODULE32ます。

別の原因として、列挙したいプロセスが起動したばかりで、モジュールをロードする準備がまだ整っていないことが考えられます。だから私はCreateToolhelp32Snapshotループで呼び出し、エラーERROR_PARTIAL_COPY(299) が発生したときに 200 ミリ秒待ってから、このエラーが発生しなくなるまでモジュールの列挙を再試行します。

これが機能しない場合は、別の API を使用してモジュールを列挙する必要があります。この記事をご覧ください: http://www.codeproject.com/Articles/19685/Get-Process-Info-with-NtQueryInformationProcess

このPEB_LDR_DATA構造体には、プロセス用にロードされたモジュールに関する情報が含まれています。

詳細はこちら: https://msdn.microsoft.com/en-us/library/aa813708.aspx

編集:上記で問題が解決しないケースが見つかりました。CreateToolHelpSnapshot が 64 ビット プロセスでも実行されている場合にのみ、64 ビット プロセスでのモジュールの列挙が正しく機能することがわかりました。Microsoft がこれを非常にバグのあるものとして実装したのは残念です。

于 2015-11-23T16:11:15.087 に答える