NdisAllocateRWLock 関数 (ndis.h)
NdisAllocateRWLock 関数は、NDIS_RW_LOCK_EX型の読み取り/書き込みロック変数を割り当てます。
構文
PNDIS_RW_LOCK_EX NdisAllocateRWLock(
NDIS_HANDLE NdisHandle
);
パラメーター
NdisHandle
次のいずれかの関数から返されるハンドル。
NdisMRegisterMiniportDriver
MiniportInitializeEx
NdisRegisterProtocolDriver
NdisOpenAdapterEx
NdisFRegisterFilterDriver
FilterAttach
Windows 8およびWindows Server 2012以降: 読み取り/書き込みロックが DriverEntry で割り当てられている場合、呼び出し元はこのパラメーターに NULL 値を渡すことができます。
戻り値
NdisAllocateRWLock は、割り当て可能な場合、 NDIS_RW_LOCK_EX 構造体へのポインターを返します。それ以外の場合は NULL を返します。
注釈
NDIS ドライバーは NdisAllocateRWLock 関数を呼び出して、ドライバー スレッド間で共有されるリソースへの読み取り/書き込みアクセスを制御する NDIS_RW_LOCK_EX 構造体を割り当てます。 ドライバーは、読み取り用に頻繁にアクセスされ、書き込み用にアクセス頻度の低いリソースに対して読み取り/書き込みロックを使用します。
ドライバーが割り当てる各ロックは、次のいずれかを実行できます。
- IRQL <= DISPATCH_LEVELで実行されるドライバー スレッドによる同時書き込みと読み取りアクセスから、共有リソースの個別のセットを保護します。
- IRQL <= DISPATCH_LEVELで実行されるドライバー スレッドによる同時読み取りアクセスに対して、共有リソースの個別のセットを公開します。
NDIS_RW_LOCK_EXは公平ではありません。 つまり、排他アクセスのロックの取得を待機しているプロセッサは、読み取りアクセスのロックを保持しているプロセッサによって枯渇する可能性があります。 したがって、アクセスの大半が書き込みアクセス用になる状況では、 NDIS_RW_LOCK_EX を使用しないでください。 アクセスの大部分で書き込みアクセスが必要な場合は、カーネル スピン ロックを使用する方が効率的です。 スピン ロックの詳細については、「スピン ロック の概要」を参照してください。
複数のプロセッサで読み取りアクセスの取得が多い状況では、通常、 NDIS_RW_LOCK_EX はカーネル スピン ロックよりも優れたパフォーマンスを発揮します。 NDIS_RW_LOCK_EXは、複数のプロセッサに分散された 1 秒あたりの読み取りアクセス数が多いと予想される場合に使用します。
NDIS_RW_LOCK_EX構造体は、共有リソースへの書き込みアクセスを一度に 1 つの ISR 以外のドライバー スレッドに制限する属性を定義します。 NDIS_RW_LOCK_EX構造体を使用すると、ISR 以外の複数のドライバー スレッドで、関連付けられているリソースへの同時読み取りアクセスを許可できます。 このような読み取りアクセスは、書き込みアクセス中は許可されません。
保護されたリソースを変更するには、ドライバー スレッドが NdisAcquireRWLockWrite 関数を使用して書き込みロックを取得する必要があります。 これらのリソースを読み取るだけでは、ドライバー スレッドは NdisAcquireRWLockRead 関数を使用して読み取り専用ロックを取得する必要があります。 読み取りアクセスでは、スピン ロックのインターロック操作や競合は必要ありません。 読み取り専用アクセスは、オペレーティング システムとドライバーの優れたパフォーマンスを維持するのに役立ちます。
リソース アクセスが完了すると、ドライバーは NdisReleaseRWLock 関数を呼び出します。
ドライバーは NdisFreeRWLock 関数を呼び出して、NdisAllocateRWLock 関数で割り当てたNDIS_RW_LOCK_EX構造体を解放する必要があります。
!ndiskd.ndisrwlock デバッガー拡張機能を使用して、NDIS_RW_LOCK_EXを検査し、リーダーの数を確認し、現在のライターが誰であるかを確認できます。 詳細については、「 NDIS 拡張機能 (Ndiskd.dll)」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | NDIS 6.20 以降でサポートされています。 |
対象プラットフォーム | ユニバーサル |
Header | ndis.h (Ndis.h を含む) |
Library | Ndis.lib |
IRQL | <=DISPATCH_LEVEL |