NdisDprAcquireReadWriteLock 関数 (ndis.h)

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

メモNdisDprAcquireReadWriteLock の代わりに NdisAcquireRWLockRead または NdisAcquireRWLockWrite (Flags パラメーターでNDIS_RWL_AT_DISPATCH_LEVEL設定) を使用する必要がある NDIS 6.20 以降のドライバーでは、読み取り/書き込みロック インターフェイスは非推奨です。
 

構文

void NdisDprAcquireReadWriteLock(
  [in, out] PNDIS_RW_LOCK Lock,
  [in]      BOOLEAN       fWrite,
  [out]     PLOCK_STATE   LockState
);

パラメーター

[in, out] Lock

ロックを表す不透明な変数へのポインター。 呼び出し元は、このロックを使用して共有リソースにアクセスできます。

[in] fWrite

ブール値です。 値が TRUE の場合、この関数には共有リソースへの書き込みアクセスが提供されます。値が FALSE の場合、この関数には読み取りアクセスが提供されます。

[out] LockState

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

戻り値

なし

解説

ドライバーは、 を使用して NDIS_RW_LOCK 型の変数を初期化する必要があります。ドライバーが他の NdisXxxReadWriteLock 関数を呼び出す前に NdisInitializeReadWriteLock 関数。 ドライバーは、使用するロックに常駐ストレージを提供する必要があります。

NdisDprAcquireReadWriteLock を使用してロックを取得した後、呼び出し元は NdisDprReleaseReadWriteLock 関数を呼び出してロックを解放する必要があります。 ロックの参照カウントをデクリメントするには、ドライバーが を呼び出す必要があります。
NdisDprAcquireReadWriteLock の呼び出しごとに 、NdisDprReleaseReadWriteLock を 1 回実行します。

同じロックで NdisDprAcquireReadWriteLockNdisDprAcquireReadWriteLock の両方を使用しても安全です。 ただし、 NdisDprAcquireReadWriteLock でロックを取得する場合は、 NdisDprReleaseReadWriteLock を使用して解放されるように、呼び出しのバランスを取る必要があります。 同様に、 NdisAcquireReadWriteLock を使用してロックを取得する場合は、 NdisReleaseReadWriteLock を使用してロックを解放する必要があります。

一部のアーキテクチャでは、 NdisDprAcquireReadWriteLockNdisAcquireReadWriteLock よりも高速に実行されます。 ドライバーは、現在の IRQL が既にDISPATCH_LEVELされていることを確認するときに、NdisAcquireReadWriteLock ではなく NdisDprAcquireReadWriteLock を使用できます。 ただし、必須ではありません。 KeGetCurrentIrql 関数を呼び出すオーバーヘッドは、NdisAcquireReadWriteLock ではなく NdisDprAcquireReadWriteLock を呼び出すパフォーマンス上利点よりも大きくなります。

ドライバー スレッド間で共有されるリソースを変更するには、ドライバー スレッドが書き込みロックを取得する必要があります。 これらのリソースを監視するには、ドライバー スレッドが読み取り専用ロックを取得する必要があります。 読み取りアクセスでは、スピン ロックのインターロック操作や競合は必要ありません。 読み取り専用アクセスを使用すると、適切なオペレーティング システムとドライバーのパフォーマンスを維持するのに役立ちます。

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

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

NDIS スピン ロックの取得と解放の詳細については、「 ネットワーク ドライバーでの同期と通知」を参照してください。

要件

要件
サポートされている最小のクライアント NDIS 6.20 以降のドライバーでは非推奨となり、NdisDprAcquireReadWriteLock の代わりに NdisAcquireRWLockRead または NdisAcquireRWLockWrite を使用する必要があります。 NDIS 6.0 および 6.1 でサポートされています。
対象プラットフォーム ユニバーサル
Header ndis.h (Ndis.h を含む)
Library Ndis.lib
IRQL = DISPATCH_LEVEL

こちらもご覧ください

LOCK_STATE

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisDprReleaseReadWriteLock

NdisInitializeReadWriteLock

NdisMSynchronizeWithInterruptEx