ディスパッチ ルーチンと IRQL

ほとんどのドライバーのディスパッチ ルーチンは、IRQL = PASSIVE_LEVEL の任意のスレッド コンテキストで呼び出されます。ただし、次の例外があります。

  • 最上位ドライバーのディスパッチ ルーチンは、I/O 要求を発生させたスレッドのコンテキストで呼び出されます。これは通常、ユーザー モードのアプリケーション スレッドです。

    言い換えると、ファイル システム ドライバーやその他の最上位ドライバーのディスパッチ ルーチンは、IRQL = PASSIVE_LEVEL の非ビット スレッド コンテキスト内で呼び出されます。

  • 最下位レベルのデバイス ドライバー、およびシステム ページング パスでそれらの上にレイヤー化された中間ドライバーの DispatchReadDispatchWriteDispatchDeviceControl ルーチンは、IRQL = APC_LEVEL の任意のスレッド コンテキストで呼び出すことができます。

    DispatchRead ルーチンや DispatchWrite ルーチン、およびこのような最下位レベルのデバイスまたは中間ドライバーで読み取り要求や書き込み要求を処理するその他のルーチンは、常に常駐している必要があります。 これらのドライバー ルーチンは、ページング可能であってはならず、ドライバーのページング可能なイメージ セクションの一部にすることもできません。また、ページング可能なメモリにアクセスできません。 さらに、ブロック呼び出し (0 以外のタイムアウトを持つ KeWaitForSingleObject など) に依存してはなりません。

  • 休止状態またはページング パス内のドライバーの DispatchPower ルーチンは、IRQL = DISPATCH_LEVEL で呼び出すことができます。 このようなドライバーの DispatchPnP ルーチンは、PnP IRP_MN_DEVICE_USAGE_NOTIFICATION 要求を処理するために準備する必要があります。

  • 起動時に突入電力を必要とするドライバーの DispatchPower ルーチンは、IRQL = DISPATCH_LEVEL で呼び出すことができます。

詳細については、「ハードウェアの優先度の管理」を参照してください。