次の方法で共有


NdisAcquireRWLockRead 関数 (ndis.h)

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

構文

void NdisAcquireRWLockRead(
  [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 が不明な場合は、KeGetCurrentIrql を使用して現在の IRQL をテストしないでください。このフラグを設定するかどうかを判断するためだけに、ndisAcquireRWLockRead 関数 IRQL 自体をテストする方が効率的です。
 

戻り値

何一つ

備考

NDIS ドライバーは、NdisAcquireRWLockRead 関数を呼び出して、ドライバー スレッド間で共有されているリソースへの読み取り専用アクセスを取得します。

ドライバーは、NdisAcquireRWLockRead 関数を呼び出す前に、NdisAllocateRWLock 関数で NDIS_RW_LOCK_EX 型の変数を割り当てる必要があります。

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

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

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

ドライバーは、読み取りまたは書き込みアクセスからリソースを保護するロックを使用することはできません。その他の関数は、ミニポートInterrupt または ミニポートDisableInterruptEx 関数、またはその両方。 代わりに、ドライバーが呼び出す必要がありますNdisMSynchronizeWithInterruptEx します。 ミニポートSynchronizeInterrupt 関数は、その ミニポートInterrupt または同じ DIRQL でこのような共有リソースにアクセスします。 ミニポートDisableInterruptEx 関数、またはその両方が行います。

NdisAcquireRWLockRead は常に IRQL を IRQL = DISPATCH_LEVELに生成します。

必要条件

要件 価値
サポートされる最小クライアント NDIS 6.20 以降でサポートされています。
ターゲット プラットフォーム 万国
ヘッダー ndis.h (Ndis.h を含む)
ライブラリ Ndis.lib
IRQL <= DISPATCH_LEVEL

関連項目

LOCK_STATE_EX

ミニポートDisableInterruptEx

ミニポートInterrupt

ミニポート同期Interrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockWrite

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock