待機と APC

Note

このページで説明されているユーザー APC の動作は、通常のユーザーモード APC にも特別なユーザーモード APC にも適用されます。

ユーザー モードの呼び出し元に代わってディスパッチャー オブジェクトを待機するスレッドは、ユーザー APC またはスレッド終了によって、その待機が中断される可能性があることを考慮する必要があります。 スレッドが KeWaitForSingleObjectKeWaitForMultipleObjectsKeWaitForMutexObject, または 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 はい いいえ
Alertable = FALSEWaitMode = UserMode はい、スレッド終了の場合。 いいえ、ユーザー APC の場合。 いいえ
Alertable = FALSEWaitMode = KernelMode いいえ いいえ

スレッドのカーネル API を無効にすることができます。 スレッドのカーネル APC を無効にした場合、そのスレッドのユーザー APC 配信とスレッド終了の両方も無効になります。 APC を無効にする方法の詳細については、「 APC の無効化」を参照してください。

オペレーティング システムの内部で使用頻度の低いメカニズムであるアラートは、警告可能な待機状態を中断することもできます。 アラートは、 Alertable = TRUEのとき、 WaitMode パラメータの値に関係なく、待機を中断できます。 待機ルーチンは、STATUS_ALERTED の値を返します。

カーネル APC はプリエンプティブに実行され、 KeWaitForXxx または KeDelayExecutionThread が返されないことに注意してください。 システムは中断し、内部で待機を再開します。 通常、ドライバーはこのプロセスの影響を受けませんが、 KePulseEventの呼び出しなど、一時的な条件に対して、ドライバーがディスパッチャー オブジェクト信号をを見逃す可能性があります。