次の方法で共有


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

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

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

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

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

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

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

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

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