割り込みコードの同期 (UMDF 1)
警告
UMDF 2 は UMDF の最新バージョンであり、UMDF 1 よりも優先されます。 すべての新しい UMDF ドライバーは、UMDF 2 を使用して記述する必要があります。 UMDF 1 には新機能が追加されておらず、Windows 10 の新しいバージョンでは UMDF 1 のサポートが制限されています。 ユニバーサル Windows ドライバーでは、UMDF 2 を使用する必要があります。
アーカイブされた UMDF 1 サンプルは、「Windows 11、バージョン 22H2 - 2022 年 5 月 ドライバーサンプルの更新」でご確認いただけます。
詳しくは、「UMDF の概要」をご覧ください。
割り込みデータ バッファーにアクセスするすべてのドライバー コードは、一度に 1 つのルーチンのみがデータにアクセスできるように同期する必要があります。
割り込みコードは、手動割り込みロックまたは自動コールバック シリアル化を使用して同期できます。
手動割り込みロック
UMDF は、OnInterruptIsr、OnInterruptDisable、または OnInterruptEnable コールバックを呼び出す前に割り込みロックを取得します。
割り込みロックを使用してコードを同期する必要がある場合は、IWDFInterrupt::AcquireInterruptLock と IWDFInterrupt::ReleaseInterruptLock を呼び出します。 たとえば、ドライバーが取得し、これらのメソッドを使用して、その OnInterruptWorkItem コールバック ルーチンの割り込みロックを解放します。 ただし、I/O ディスパッチ コールバック (OnRead や OnWrite など) では、ドライバーは最初に IWDFInterrupt::TryToAcquireInterruptLock を呼び出して、作業項目をキューに入れるか、同じスレッドで処理を実行してデッドロックの可能性を回避するかを決定します。 任意のスレッド コンテキストから IWDFInterrupt::AcquireInterruptLock を呼び出すことによって発生する可能性があるデッドロック シナリオの例については、IWDFInterrupt::AcquireInterruptLock の「解説」セクションを参照してください。
IWDFInterrupt::TryToAcquireInterruptLock が TRUE を返した場合、ドライバーは同じスレッドで割り込みロックを取得したことになります。 この場合、ドライバーはロックを必要とする作業を実行し、ReleaseInterruptLock を呼び出します。 IWDFInterrupt::TryToAcquireInterruptLock が FALSE を返す場合、ドライバーは作業項目をキューに入れ、その OnWorkItem コールバックで作業を実行します。 この場合、作業項目では自動シリアル化を使用しないでください。
自動シリアル化の使用
UMDF ドライバーは、LockType パラメーターを WdfDeviceLevel に設定して IWDFDeviceInitialize::SetLockingConstraint を呼び出すことによって、自動コールバック同期を要求できます。
その後、ドライバーは、CreateInterrupt を呼び出す前に、その WUDF_INTERRUPT_CONFIG 構造体の AutomaticSerialization メンバーを TRUE に設定します。
その結果、UMDF は、I/O キュー、要求の取り消し、およびファイル オブジェクトコールバック ルーチンを使用して、ドライバー の OnInterruptWorkItem コールバックをシリアル化します。 このシナリオでは、UMDF は割り込みオブジェクトごとのロックではなく、コールバック ロックを使用します。