Windows 7 でカーネル ドライバーまたは API フックを使用してプロセス/スレッド コンテキスト スイッチを監視するにはどうすればよいですか? プロセス (Internet Explorer など) がコンテキスト切り替え時にレジューム/サスペンド状態になったときのレジスタ値をログに記録したいと考えています。
1 に答える
答えは、何を達成したいのか、どのような制限があるのかによって多少異なります。
最初に、OP の内容よりも範囲をいくらか狭める必要があると思います。特に、「再開/一時停止」は、必要なものを知るのに十分に定義されていません。実際、Windows には「サスペンド プロセス」API がありません。Procmon は、プロセス内のすべてのスレッドを中断することによって、プロセスを中断します。
プロセスの切り替えが発生したときのことだと思います。プロセスの切り替えは、スレッドの切り替えがないと発生しません。したがって、知りたいのは、プロセス X が所有するスレッドが IE が所有するスレッドに切り替えられたとき (例を使用するため)、および IE が所有するスレッドが他のプロセスが所有するスレッドに切り替えられたときです。
私が考えることができる最も簡単な方法は、カーネル デバッガー (Windbg、KD) を使用し、スレッドを切り替えるカーネル関数にブレークポイントを設定することです。その関数が何を意味するかは覚えていませんが、カーネル API (WaitForSingleEvent など) をいくつでも逆アセンブルして、ブロックする必要があるときにそれらが何をするかを確認できます。制御をスレッド ディスパッチャに渡す必要があります。または、もっと簡単に、システム プロセス内のすべてのスレッドのスタック ダンプを見てください (オプションを確認するには、!process のヘルプを参照してください)。それらの多くはディスパッチャにあります。
スレッドの切り替えをログに記録したい場合は、1) IE への/からのプロセスの切り替えが発生したかどうかを確認するデバッガー関数を記述して、2) 何らかの方法でデータをログに記録することができます。ただし、IE セッションですべてのスレッド スイッチをキャプチャする場合、デバッガーの使用は実用的ではありません。それは遅すぎるでしょう。
もう 1 つの可能性は、Event Tracing for Windows (ETW) です。ETW は大きなトピックなので、Google で検索してください。具体的には、カーネルのイベントのトレースを探します。1) カーネル ディスパッチ イベントの ETW を有効にする方法、2) イベントをファイルにキャプチャする方法、3) ファイル内のイベントを表示/処理する方法。イベントを後処理して、関心のあるイベントを抽出するプログラムを作成する必要がある場合があります。
最後に、Windows Kernel Hooking などをグーグルで検索できます。Microsoft は、後のバージョンの Windows でカーネル API をフックすることをより困難にしました。Win7 と Vista と Win8 での正確な違いはわかりませんが、Google として覚えておく必要があります。何年も前に Microsoft Research から出てきたカーネル フック活動を思い出します。
カーネル API をフックする API が見つかった場合は、ユーザー モードからすべてを制御できるフレームワークが見つからない限り、何らかのドライバー開発に参加することになります。
ドライバー開発、カーネル ハッキングなどを専門とするサイトでこれを尋ねると、より良い結果が得られるかもしれません。OSR にはメッセージ ボードを含むかなり優れたリソース セットがあることを私は知っています。
幸運を。