NdisAcquireRWLockWrite 関数 (ndis.h)

NdisAcquireRWLockWrite 関数は、呼び出し元がドライバー スレッド間で共有されているリソースへの書き込みアクセスに使用する書き込みロックを取得します。

構文

void NdisAcquireRWLockWrite(
  [in]  PNDIS_RW_LOCK_EX Lock,
  [out] PLOCK_STATE_EX   LockState,
  [in]  UCHAR            Flags
);

パラメーター

[in] Lock

ロックを表す不透明な NDIS_RW_LOCK_EX 変数へのポインター。 呼び出し元は、このロックを使用して、ISR 以外のドライバー スレッド間で共有されているリソースへの書き込みまたは読み取りアクセスを取得できます。

[out] LockState

ロックの状態を追跡する不透明な LOCK_STATE_EX 変数へのポインター。 この変数は、呼び出し元がロックを取得して解放するまでの間隔に存在します。 呼び出し元は、同じ ISR 以外のドライバー スレッドからロックを取得しようとするたびに、 LOCK_STATE_EX型の 異なる変数を使用する必要があります。

[in] Flags

ロック フラグを含む ULONG 値。 呼び出し元の現在の IRQL が DISPATCH_LEVEL 場合は、このパラメーターを NDIS_RWL_AT_DISPATCH_LEVEL に設定します。 それ以外の場合は、このパラメーターを 0 に設定します。 ディスパッチ IRQL 追跡の詳細については、「 ディスパッチ IRQL 追跡」を参照してください。

メモ 呼び出し元が現在の IRQL が DISPATCH_LEVELされていることを認識している場合は、このパラメーターを NDIS_RWL_AT_DISPATCH_LEVEL に設定します。 このフラグにより、現在の IRQL のチェックが省略されるため、ロックがさらに効率的になります。 現在の IRQL が不明な場合は、NdisAcquireRWLockWrite 関数が IRQL 自体をテストできるようにする方が効率的であるため、KeGetCurrentIrql を使用して現在の IRQL をテストせずに、このフラグを設定するかどうかを判断してください。
 

戻り値

なし

解説

NDIS ドライバーは、 NdisAcquireRWLockWrite 関数を呼び出して、ドライバー スレッド間で共有されるリソースを変更します。

ドライバーは、ドライバーが NdisAcquireRWLockWrite 関数を呼び出す前に、NdisAllocateRWLock 関数を使用してNDIS_RW_LOCK_EX型の変数を割り当てる必要があります。 ドライバーは、使用するロックの常駐ストレージの NdisAllocateRWLock へのハンドルを提供する必要があります。

ドライバーは NdisAllocateRWLock を呼び出した後、 NdisAcquireRWLockWrite または NdisAcquireRWLockRead を呼び出して、リソースへの書き込みアクセスまたは読み取りアクセスを取得できます。 リソースへの書き込みアクセス権を取得できるのは、ISR 以外のドライバー スレッドが一度に 1 つだけです。 1 つの ISR 以外のスレッドが書き込みアクセス権を持つ場合、他の ISR 以外のスレッドによる読み取りおよび書き込みアクセスはすべて、書き込みアクセス所有者がロックを解放するまで待機する必要があります。 ただし、ISR 以外のスレッドに読み取りアクセス権がある場合、他の ISR 以外のスレッドは読み取りアクセスを同時に取得できます。

NDIS_RW_LOCK_EX ロックでは、読み取りから書き込みへの昇格はサポートされていません。 プロセッサが読み取りアクセス用 のNDIS_RW_LOCK_EX を取得した後 ( NdisAcquireRWLockRead を呼び出すことによって)、以前の読み取りアクセスが解放されるまで、同じプロセッサが書き込みアクセス権の取得を試みてはなりません ( NdisAcquireRWLockWrite を呼び出す)。

NDIS_RW_LOCK_EX書き込みロックは、同じプロセッサで再帰的に取得できます。 NdisAcquireRWLockWrite の呼び出しごとに、対応する NdisReleaseRWLock の呼び出しが必要です。 ロックは、 NdisReleaseRWLock の最後の呼び出しの後にのみ解放されます。

ドライバー スレッドは、数マイクロ秒を超える書き込みロックを保持しないでください。 書き込みロックを長期間保持すると、オペレーティング システムとドライバーの両方のパフォーマンスが低下します。

ドライバーは、ロックを使用して、その他の関数が MiniportInterrupt または と共有する読み取りまたは書き込みアクセスからリソースを保護することはできません。 MiniportDisableInterruptEx 関数、またはその両方。 代わりに、ドライバーは を呼び出す必要があります NdisMSynchronizeWithInterruptEx MiniportSynchronizeInterrupt 関数は、 MiniportInterrupt または MiniportDisableInterruptEx 関数、またはその両方を実行します。

NdisAcquireRWLockWrite は、スピン ロックを取得して IRQL をDISPATCH_LEVEL します。

要件

要件
サポートされている最小のクライアント NDIS 6.20 以降でサポートされています。
対象プラットフォーム ユニバーサル
Header ndis.h (Ndis.h を含む)
Library Ndis.lib
IRQL <= DISPATCH_LEVEL

こちらもご覧ください

LOCK_STATE_EX

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock