NdisDprAcquireReadWriteLock 関数 (ndis.h)
NdisDprAcquireReadWriteLock 関数は、ドライバー スレッド間で共有されているリソースへの書き込みアクセスまたは読み取りアクセスに呼び出し元が使用するロックを取得します。
構文
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 回実行します。
同じロックで NdisDprAcquireReadWriteLock と NdisDprAcquireReadWriteLock の両方を使用しても安全です。 ただし、 NdisDprAcquireReadWriteLock でロックを取得する場合は、 NdisDprReleaseReadWriteLock を使用して解放されるように、呼び出しのバランスを取る必要があります。 同様に、 NdisAcquireReadWriteLock を使用してロックを取得する場合は、 NdisReleaseReadWriteLock を使用してロックを解放する必要があります。
一部のアーキテクチャでは、 NdisDprAcquireReadWriteLock は NdisAcquireReadWriteLock よりも高速に実行されます。 ドライバーは、現在の 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 |