フレームワーク ロックの使用

ドライバーは、フレームワークが提供する同期に加えて、または代替として、I/O 要求関連のコールバック関数のドライバー固有の同期を提供する必要があります。 ドライバーは、コールバック同期ロック、スピン ロック、待機ロック、割り込みロックを使用してドライバー コードを同期できます。

コールバック同期ロック

フレームワークの自動同期機能を使用するようにドライバーを設定した場合、フレームワークは、ドライバーの I/O 要求関連のイベント コールバック関数を呼び出す前に同期ロックを取得します。

フレームワーク デバイス オブジェクトとキュー オブジェクトに関連付けられているこれらの コールバック同期ロックは、ドライバーによって取得することもできます。 同期ロックを取得するために、ドライバーは WdfObjectAcquireLock を呼び出します。 ロックを解除するために、ドライバーは WdfObjectReleaseLock を呼び出します。

ドライバーがフレームワークのデバイス レベルまたはキュー レベルの I/O 要求関連コールバック関数の同期を使用しているが、IRQL = PASSIVE_LEVEL で実行されるコードを IRQL = DISPATCH_LEVEL で実行されるコールバック関数と同期する必要がある場合は、ドライバーでコールバック同期ロックを使用できます。 これは、ドライバーが同じ IRQL で実行されるコールバック関数に対してのみ自動同期を使用できるためです。

たとえば、ドライバーは、作業項目オブジェクトの親の実行レベルが WdfExecutionLevelPassive である場合にのみ、作業項目オブジェクトの自動同期を使用できます (作業項目のコールバック関数は常に IRQL= PASSIVE_LEVEL で実行されるため)。 そのため、ドライバーがデバイス オブジェクトの WDF_OBJECT_ATTRIBUTES 構造体の ExecutionLevel メンバーで WdfExecutionLevelDispatch を指定する場合、ドライバーは、子作業項目オブジェクトの構成構造体の AutomaticSerialization メンバーを設定できません。 代わりに、ドライバーは、親デバイス オブジェクトのコールバック関数と EvtWorkItem コールバック関数を同期するコールバック同期ロックを取得する必要があります。

フレームワーク待機ロック

フレームワーク待機ロックを使用して、IRQL = PASSIVE_LEVEL で実行されるコードからドライバー データへのアクセスを同期します。 ドライバーは、フレームワーク待機ロックを使用する前に、WdfWaitLockCreate を呼び出して待機ロック オブジェクトを作成する必要があります。 その後、ドライバーは WdfWaitLockAcquire を呼び出してロックを取得し、WdfWaitLockRelease を呼び出して解放できます。

フレームワーク スピン ロック

フレームワーク スピン ロックを使用して、IRQL <= DISPATCH_LEVEL で実行されるコードからドライバー データへのアクセスを同期します。 ドライバー スレッドがスピン ロックを取得すると、システムはスレッドの IRQL をDISPATCH_LEVEL に設定します。 スレッドがロックを解除すると、システムはスレッドの IRQL を以前のレベルに復元します。

自動フレームワーク同期を使用していないドライバーは、スピン ロックを使用して、デバイス オブジェクトのコンテキスト空間へのアクセスを同期する可能性があります。コンテキスト領域が書き込み可能であり、ドライバーのイベント コールバック関数が複数の場合は、領域にアクセスします。

ドライバーは、フレームワークスピン ロックを使用する前に、WdfSpinLockCreate を呼び出してスピンロック オブジェクトを作成する必要があります。 その後、ドライバーは WdfSpinLockAcquire を呼び出してロックを取得し、WdfSpinLockRelease を呼び出して解放できます。

スピン ロックの使用例については、「送信済み要求の取り消しの同期」を参照してください。

フレームワーク割り込みロック

DIRQL 割り込み処理をサポートする割り込みオブジェクトの場合、フレームワーク割り込みロックはスピン ロックです。 ドライバーが割り込みスピン ロックを取得すると、ドライバーはロックを解除するまでデバイスの DIRQL で実行されます。 割り込みロックの使用の詳細については、「割り込みコードの同期」を参照してください。

パッシブレベルの処理をサポートする割り込みオブジェクトの場合、フレームワーク割り込みロックは待機ロックです。 ドライバーが割り込み待機ロックを取得すると、ドライバーは IRQL = PASSIVE_LEVEL でロックを解除するまで実行されます。 パッシブレベルの処理の詳細については、「パッシブレベル割り込みのサポート」を参照してください。