スレッドとプロセスの制御

デバッガーエンジンでのスレッドとプロセスの概要については、「 スレッドとプロセス」を参照してください。

イベントが発生すると、イベントスレッドとイベントプロセスは、イベントが発生したスレッドとプロセス (オペレーティングシステムまたは仮想) に設定されます。 これらは、それぞれ Geteventthreadgeteventthreadを使用して見つけることができます。

暗黙のスレッドとプロセス

カーネルモードのデバッグでは、デバッガーエンジンは 暗黙的なプロセス を使用して、仮想から物理アドレスへの変換を実行するときに使用する仮想アドレス空間を決定します。たとえば、 virtualtophysicalreadvirtualなどです。 イベントが発生すると、暗黙のプロセスが現在のプロセスに設定されます。

暗黙のプロセスは、 SetImplicitProcessDataOffsetを使用して変更できます。 暗黙的なプロセスを特定するには、 GetImplicitProcessDataOffsetを使用します。

メモ ライブカーネルデバッグセッション中に ブレークポイント を設定すると、デバッガーエンジンによってブレークポイントの仮想アドレスがターゲットに渡され、ターゲットはブレークポイントを設定します。 この場合、ブレークポイントを処理するときに、ターゲットのプロセスコンテキストのみが使用されます。暗黙のプロセスの値は無関係です。

カーネルモードのデバッグでは、デバッガーエンジンは暗黙的な スレッド を使用して、ターゲットの レジスタの一部を決定します。 これには、プロセッサスタック ( Getstackoffsetを参照)、フレームオフセット (「 getフレームオフセット」を参照)、および命令オフセット (「 GetInstructionOffset」を参照) が含まれます。 イベントが発生すると、暗黙的なスレッドが現在のスレッドに設定されます。

暗黙的なスレッドは SetImplicitThreadDataOffsetを使用して変更できます。 暗黙的なスレッドを特定するには、 GetImplicitThreadDataOffsetを使用します。

すべてのレジスタが暗黙的なスレッドによって決定されるわけではありません。 一部のレジスタは、暗黙的なスレッドが変更されても同じままです。

警告 暗黙のプロセスと暗黙的なスレッドは独立しています。 暗黙のスレッドが暗黙的なプロセスに属していない場合、暗黙的なスレッドのユーザーとセッションの状態は間違った仮想アドレス空間になり、この情報にアクセスしようとするとエラーが発生するか、正しくない結果が返されます。 カーネルメモリアドレスはすべての仮想アドレス空間で一定であるため、カーネルメモリにアクセスしても、この問題は発生しません。 したがって、カーネルメモリに存在する暗黙のスレッドに関する情報は、暗黙的なプロセスとは無関係にアクセスされる可能性があります。

レッド

エンジンスレッド IDは、各オペレーティングシステムスレッドとターゲットの各仮想スレッドを識別するために、デバッガーエンジンによって使用されます。

ターゲットが停止されている間、各スレッドには、それが属するプロセスを基準としたインデックスもあります。 どのプロセスでも、プロセス内の最初のスレッドのインデックスは0になり、最後のスレッドのインデックスはプロセス内のスレッドの数から1を引いたものになります。 現在のプロセス内のスレッドの数は、 Getnumber スレッドを使用して見つけることができます。 現在のターゲットに含まれるすべてのプロセス内のスレッドの合計数は、 Gettotalnumber スレッドを使用して見つけることができます。

現在のプロセス内の1つまたは複数のスレッドのエンジンスレッド ID とシステムスレッド ID は、 getて、getを使用してインデックスから見つけることができます。

エンジンは、各スレッドに関する情報の一部を保持します。 この情報は、現在のスレッドに対してクエリを行うことができ、スレッドのエンジンスレッド ID を検索するために使用できます。

システムスレッド ID (ユーザーモードデバッグのみ)
現在のスレッドのシステムスレッド ID は、 Getcurrentthreadsystemidを使用して見つけることができます。 システムスレッド ID が指定されている場合は、対応するエンジンスレッド ID を使用して、対応するエンジンスレッド id を見つけることができます。

スレッド環境ブロック (TEB)
現在のスレッドの TEB のアドレスは、 GetCurrentThreadTebを使用して見つけることができます。 指定された TEB のアドレスについては、対応するエンジンスレッド ID が、 getを使用して検出される場合があります。 カーネルモードのデバッグでは、(仮想) スレッドの TEB は、最後のイベントが発生したときに、対応するプロセッサ上で実行されていたシステムスレッドの TEB です。

データオフセット
ユーザーモードのデバッグでは、(システム) スレッドのデータオフセットは、そのスレッドの TEB の場所です。 カーネルモードのデバッグでは、(仮想) スレッドのデータオフセットは、最後のイベントが発生したときに、対応するプロセッサ上で実行されていたシステムスレッドの KTHREAD 構造体になります。 現在のスレッドのデータオフセットは、 GetCurrentThreadDataOffsetを使用して見つけることができます。 特定のデータオフセットでは、対応するエンジンスレッド ID が GetThreadIdByDataOffsetを使用して検出される場合があります。

システムハンドル
現在のスレッドのシステムハンドルは、 Getcurrentthreadhandleを使用して見つけることができます。 システムハンドルが指定されている場合は、対応するエンジンのスレッド ID が、 Get3-dを使用して検出されることがあります。 カーネルモードのデバッグでは、(仮想) プロセスごとに人工ハンドルが作成されます。 このハンドルは、デバッガーエンジンの API クエリでのみ使用できます。

プロセス

エンジンプロセス IDは、各オペレーティングシステムプロセスと、ターゲットの各仮想プロセスを識別するために、デバッガーエンジンによって使用されます。

ターゲットが停止されている間、各プロセスにはターゲットを基準としたインデックスがあります。 ターゲット内の最初のプロセスのインデックスは0で、最後のプロセスのインデックスはターゲット内のプロセスの数から1を引いた値です。 現在のターゲットに含まれるプロセスの数は、 Getnumber プロセスを使用して見つけることができます。

現在のターゲット内の1つ以上のスレッドのエンジンプロセス ID とシステムプロセス ID は、 Getprocessidsbyindexを使用してインデックスから見つけることができます。

エンジンは、各プロセスに関する情報の一部を保持します。 この情報は、現在のプロセスに対してクエリが実行され、プロセスのエンジンプロセス ID を検索するために使用される場合があります。

システムプロセス ID (ユーザーモードデバッグのみ)
現在のプロセスのシステムプロセス ID は、 Getcurrentprocesssystemidを使用して見つけることができます。 特定のシステムプロセス ID では、対応するエンジンプロセス ID が Getprocessidbysystemidを使用して検出される場合があります。

プロセス環境ブロック (PEB)
現在のプロセスの PEB のアドレスは、 Getcurrentprocesの bを使用して確認できます。 特定の PEB アドレスについては、 Getprocessidbypebを使用して、対応するエンジンプロセス ID を見つけることができます。 カーネルモードのデバッグでは、(仮想) プロセスの PEB は、最後のイベントが発生したときに実行されていたシステムプロセスの PEB です。

データオフセット
ユーザーモードのデバッグでは、(システム) プロセスのデータオフセットは、そのプロセスの PEB の場所です。 カーネルモードのデバッグでは、(仮想) プロセスのデータオフセットは、最後のイベントが発生したときに実行されていたシステムプロセスの KPROCESS 構造です。 現在のプロセスのデータオフセットは、 GetCurrentProcessDataOffsetを使用して見つけることができます。 特定のデータオフセットでは、対応するエンジンプロセス ID が GetProcessIdByDataOffsetを使用して検出される場合があります。

システムハンドル
現在のプロセスのシステムハンドルは、 GetCurrentProcessHandleを使用して見つけることができます。 特定のシステムハンドルでは、対応するエンジンプロセス ID が Getprocessidbyhandleを使用して検出される場合があります。 カーネルモードのデバッグでは、(仮想) プロセス用に人工ハンドルが作成されます。 このハンドルは、デバッガーエンジンのクエリでのみ使用できます。

記録

ライブユーザーモードのデバッグでは、スレッドが作成されるかターゲットで終了するたびに、スレッドの作成とスレッドの終了のデバッグイベントが生成されます。 これらのイベントによって、 IDebugEventCallbacks:: CreateThread メソッドと IDebugEventCallbacks:: exitthread コールバックメソッドが呼び出されます。

ライブユーザーモードのデバッグでは、プロセスが作成されるかターゲットで終了するたびに、作成プロセスと終了プロセスのデバッグイベントが生成されます。 これらのイベントによって、 IDebugEventCallbacks:: CreateProcess メソッドと IDebugEventCallbacks:: ExitProcess callback メソッドが呼び出されます。

イベントの詳細については、「 イベントの監視」を参照してください。

追加情報

TEB、kthread、peb、kthread 構造体など、スレッドとプロセスの詳細については、「 Microsoft Windows 内部の David ソロモンおよび Mark Russinovich」を参照してください。