ディスパッチ IRQL の追跡

システム のパフォーマンス向上のため、NDIS 関数 (例えばMiniportSendNetBufferLists 関数) には、現在の IRQL を示すディスパッチ レベル フラグが含まれているものもあります。 ディスパッチ レベル フラグを適切に使用すると、IRQL 設定時の不要な試行を回避するのに役立ちます。

他の属性を制御するフラグは他にもありますが、ディスパッチ レベル フラグの名前は次のとおりです。

NDIS_Standard Edition ND_FLAGS_DISPATCH_LEVEL

NDIS_Standard Edition ND_COMPLETE_FLAGS_DISPATCH_LEVEL

NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL

NDIS_RETURN_FLAGS_DISPATCH_LEVEL

NDIS_RWL_DISPATCH_LEVEL

呼び出し側は、IRQLのテストではなく、既知の現在の IRQL からのディスパッチ レベル フラグ設定を決定しなければなりません。 例えば、IRQL はドライバー設計で決められた特性である、またはドライバーによって現在の IRQL が保存されているためです。

現在の既知の IRQL がDISPATCH_LEVELで実行されている場合、呼び出し側はこのフラグを設定する必要があります。 現在の IRQL が不明である、または呼び出し元がDISPATCH_LEVELで実行されていない場合、このフラグをクリアする必要があります。 呼び出し元が NDIS の場合、呼び出した関数は IRQL の変更をしないためにこのフラグをテストする必要があります。

ドライバーは、ディスパッチ レベル フラグの値を決めるために IRQL をテストしないでください。 テストによってフラグの目的が打ち消されます。 必要に応じて、呼び出した関数で簡単にテスト自体を実行できます。 ドライバーのフラグ設定の必要性を判断する方法は、特定のドライバーの設計に委ねられます。