注
ユーザー APC のこのページで説明されている動作は、通常のユーザー モードの APCs と特殊なユーザー モードの APCs に適用されます。
ユーザー モードの呼び出し元に代わってディスパッチャー オブジェクトを待機するスレッドは、ユーザー APC またはスレッド終了によって、その待機が中断されるように準備する必要があります。 スレッドが KeWaitForSingleObject、 KeWaitForMultipleObjects、 KeWaitForMutexObject、または KeDelayExecutionThread を呼び出すと、オペレーティング システムはスレッドを待機状態にすることができます。 通常、スレッドは、オペレーティング システムが呼び出し元が要求する操作を完了するまで待機状態のままになります。 ただし、呼び出し元が WaitMode = UserMode を指定した場合、オペレーティング システムは待機を中断する可能性があります。 その場合、ルーチンは NTSTATUS 値STATUS_USER_APCで終了します。
WaitMode = UserMode で上記の 4 つのルーチンのいずれかを呼び出すドライバーは、STATUS_USER_APCの戻り値を受け取るために準備する必要があります。 ドライバーは、STATUS_USER_APCを使用して現在の操作を完了し、ユーザー モードに制御を戻す必要があります。
オペレーティング システムが待機を中断する正確な状況は、ルーチンの Alertable パラメーターの値によって異なります。 Alertable = TRUE の場合には、待機はアラートを受け取れる状態の待機です。 それ以外の場合、待機は警告不可能な待機です。 オペレーティング システムは、ユーザー APC を配信するためにのみ、アラート待機を中断します。 オペレーティング システムは、スレッドを終了するために両方の種類の待機を中断します。
次の表では、さまざまなパラメーター設定、待機、およびユーザー APC 配信の関係について説明します。
| パラメーター | 待機が中断されましたか? | ユーザー APC が配信されましたか? |
|---|---|---|
| Alertable = TRUEWaitMode = UserMode | イエス | イエス |
| Alertable = TRUEWaitMode = KernelMode | イエス | いいえ |
| アラート可 = 偽待機モード = ユーザーモード | はい。スレッド終了の場合。 いいえ、ユーザー用APCの場合は。 | いいえ |
| Alertable = FALSEWaitMode = KernelMode | いいえ | いいえ |
スレッドのカーネル APC を無効にすることができます。 スレッドのカーネル APCs を無効にした場合、そのスレッドのユーザー APC 配信とスレッド終了の両方も無効になります。 APCs を無効にする方法の詳細については、「APCs の 無効化」を参照してください。
オペレーティング システムの内部で使用頻度の低いメカニズムであるアラートは、アラート可能な待機状態を中断することもできます。 WaitMode パラメーターの値に関係なく、Alertable = TRUE の場合、アラートは待機を中断できます。 待機ルーチンは、STATUS_ALERTEDの値を返します。
カーネル API はプリエンプティブに実行され、 KeWaitForXxx または KeDelayExecutionThread が返されないことに注意してください。 システムは、内部的に待機を中断して再開します。 通常、ドライバーはこのプロセスの影響を受けませんが、 KePulseEvent の呼び出しなど、一時的な状態のディスパッチャー オブジェクト信号をドライバーが見逃す可能性があります。