ストレージ ドライバーでのページング可能コードの制約
デッドロックを防ぐため、読み取りまたは書き込み要求の処理に使用されるストレージ ドライバーのいかなる部分にもページング可能なコードを含めてはならず、ページング可能なメモリへのアクセスも試みてはなりません。 これは、ドライバーの DispatchRead ルーチンと DispatchWrite ルーチンは IRQL > PASSIVE_LEVELで呼び出すことができ、ページ フォールトを処理するページング I/O は IRQL = APC_LEVELで行われるためです。
同様のルールは、特定の条件が満たされているストレージ ドライバーのデバイス制御ディスパッチ ルーチン DispatchDeviceControl に適用されます。 ストレージ ドライバーのデバイス制御ディスパッチ ルーチンには、ページング可能なコードやアクセス ページング可能なメモリを含めてはなりません。 ディスパッチ ルーチンは、任意の IRQL で他のドライバーを対象とした IOCTL 要求を受信し、ドライバー スタックにそれらを渡すことができなければなりません。 ドライバーは、IRQL または要求のコンテキストを変更せずに、ハンドルされないすべての IOCTL 要求をスタックに渡す必要があります。
ただし、マイクロソフトでは、すべての ストレージ IOCTL 要求を PASSIVE_LEVEL で送信することを要求しています。そのため、ディスパッチ ルーチン自体はページング可能ではありませんが、ストレージ IOCTL 要求を処理するためにページング可能なサブルーチンを呼び出すことができます。 これらのサブルーチンは、ページング可能メモリにアクセスすることもできます。
I/O を実行せず、IRQL = PASSIVE_LEVEL で実行する DriverEntry、Reinitialize、Unload などのルーチンにも、ページング可能なコードを含めることができます。
ページング パス内の記憶装置を管理するドライバーには、特別な考慮事項が適用されます。 ドライバーがページング ファイルの I/O 操作に参加している場合、ドライバーは "ページング パス" にあります。 ストレージ ドライバーがページング パス内にある場合、IRP_MJ_POWER 要求の DispatchPower ルーチンはページング可能であってはなりません。
既定では、カーネル モード ドライバーのコードはページング可能ではなく、カーネル モード ドライバーによって使用されるグローバル メモリもページング可能ではありません。 コードをページング可能にする方法については、「ドライバー コードまたはデータをページング可能にする」を参照してください。