次の方法で共有


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 が不明な場合は、NdisAcquireRWLockRead 関数が IRQL 自体をテストできるようにする方が効率的であるため、このフラグを設定するかどうかを判断するために、KeGetCurrentIrql を使用して現在の 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 の最後の呼び出し後にのみ解放されます。

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

NdisAcquireRWLockRead は常に IRQL を 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

NdisAcquireRWLockWrite

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock