ディスパッチ ルーチンと IRQL
ほとんどのドライバーのディスパッチ ルーチンは、IRQL = PASSIVE_LEVEL の任意のスレッド コンテキストで呼び出されます。ただし、次の例外があります。
最上位ドライバーのディスパッチ ルーチンは、I/O 要求を発生させたスレッドのコンテキストで呼び出されます。これは通常、ユーザー モードのアプリケーション スレッドです。
言い換えると、ファイル システム ドライバーやその他の最上位ドライバーのディスパッチ ルーチンは、IRQL = PASSIVE_LEVEL の非ビット スレッド コンテキスト内で呼び出されます。
最下位レベルのデバイス ドライバー、およびシステム ページング パスでそれらの上にレイヤー化された中間ドライバーの DispatchRead、DispatchWrite、DispatchDeviceControl ルーチンは、IRQL = APC_LEVEL の任意のスレッド コンテキストで呼び出すことができます。
DispatchRead ルーチンや DispatchWrite ルーチン、およびこのような最下位レベルのデバイスまたは中間ドライバーで読み取り要求や書き込み要求を処理するその他のルーチンは、常に常駐している必要があります。 これらのドライバー ルーチンは、ページング可能であってはならず、ドライバーのページング可能なイメージ セクションの一部にすることもできません。また、ページング可能なメモリにアクセスできません。 さらに、ブロック呼び出し (0 以外のタイムアウトを持つ KeWaitForSingleObject など) に依存してはなりません。
休止状態またはページング パス内のドライバーの DispatchPower ルーチンは、IRQL = DISPATCH_LEVEL で呼び出すことができます。 このようなドライバーの DispatchPnP ルーチンは、PnP IRP_MN_DEVICE_USAGE_NOTIFICATION 要求を処理するために準備する必要があります。
起動時に突入電力を必要とするドライバーの DispatchPower ルーチンは、IRQL = DISPATCH_LEVEL で呼び出すことができます。
詳細については、「ハードウェアの優先度の管理」を参照してください。