APC の無効化

システムには、現在のスレッドの APC を無効にする 3 つのメカニズムが用意されています。

  • クリティカル領域。 スレッドがクリティカル領域内にある場合、そのユーザー API と通常のカーネル API は実行されません。 特殊なカーネル API は引き続き実行されます。 これらの APC の種類の詳細については、「APC の種類」を参照してください。

  • 保護された領域。 スレッドが保護された領域にある場合、その APC は実行されません。

  • 現在の IRQL を APC_LEVEL 以上に引き上げる。 IRQL >= APC_LEVEL で実行されているスレッドは、すべての APC を無効にして実行されます。

これらの設定は現在のスレッドに適用され、他のスレッドの動作には影響しないことに注意してください。

一部のドライバー サポート ルーチンは、特定の種類の APC を無効にして呼び出す必要があります。 たとえば、エグゼクティブ リソース (ExAcquireResourceSharedLite など) を取得するルーチンは、通常のカーネル APC を無効にして呼び出す必要があります。 他のルーチンは、特定の種類の APC を有効にして呼び出す必要があります。 たとえば、I/O 完了ルーチン (IoVolumeDeviceToDosName など) に依存するルーチンは、特殊なカーネル APC を有効にして呼び出す必要があります。 各ルーチンのドキュメントでは、ルーチンに APC 実行の状態に関する特定の制限があるかどうかを指定します。

ドライバーは、適切なルーチンを呼び出すことによって、クリティカル領域や保護された領域を明示的に入力できます。 詳細については、「クリティカル領域と保護された領域」を参照してください。 ドライバーは、KeRaiseIrql を呼び出 すことによって、現在の IRQL を明示的に APC_LEVEL に引き上げることもできます。 その後、ドライバーは、KeLowerIrql を呼び出して、IRQL を元の値に下げる必要があります。 保護されたリージョンを使用した方が、現在の IRQL を上げ下げするよりも高速ですが、保護された領域を使用できるのは Windows Server 2003 以降のバージョンの Windows のみです。

次のミューテックス操作は、クリティカル領域または保護された領域への移行または退出、あるいは現在の IRQL の上げ下げと同じ効果があります。

  • ミューテックス オブジェクトを保持すると、ホルダーがクリティカル領域内に暗黙的に配置されます。

  • 保護されたミューテックスを保持すると、保護された領域内にホルダーが暗黙的に配置されます。

  • 高速ミューテックスを保持すると、現在の IRQL が APC_LEVEL に暗黙的に引き上げられます。

ミューテックス オブジェクトの詳細については、「ミューテックス オブジェクト」を参照してください。 高速ミューテックスと保護されたミューテックスの詳細については、「高速ミューテックスと保護されたミューテックス」を参照してください。