ERESOURCE 構造体の概要
システムは、ERESOURCE 構造体を取得および解放するルーチンと、その現在の状態を調べるルーチンを提供します。
ERESOURCE 構造体の取得と解放
ドライバーは、ERESOURCE 構造体を使用して、排他/共有同期を実装することができます。 排他/共有同期は次のように機能します。
任意の数のスレッドで、共有として ERESOURCE を取得することができます。
ERESOURCE を排他的に取得できるスレッドは 1 つだけです。 ERESOURCE は、共有として既に取得されているスレッドがない場合にのみ、排他的に取得することができます。
現在 ERESOURCE を取得できないスレッドは、ERESOURCE を取得できるようになるまで、必要に応じて待機状態にすることができます。 システムは、ERESOURCE を待機しているスレッドの 2 つのリスト (排他的待機処理のリストと共有待機処理のリスト) を保持します。
排他/共有同期の一般的な用途は、読み取り/書き込みロックの実装です。 読み取り/書き込みロックでは、複数のスレッドで読み取り操作を実行できますが、一度に書き込むことができるのは 1 つのスレッドだけです。 これは、ERESOURCE を取得するという点では、直接実装できます。
ドライバーは、ERESOURCE のストレージを割り当て、ExInitializeResourceLite を使用して初期化します。 システムは、使用中のすべての ERESOURCE 構造体のリストを保持します。 ドライバーで特定の ERESOURCE が必要なくなった場合は、ドライバーは ExDeleteResourceLite を呼び出してシステムの一覧から削除する必要があります。 ドライバーは、ExReinitializeResourceLite を呼び出すことによって ERESOURCE を再利用することもできます。
ドライバーは、ERESOURCE に対して次の基本的な操作を実行できます。
ExAcquireResourceSharedLite を使用して、ERESOURCE を共有として取得します。 このルーチンは、リソースが排他的に取得されておらず、排他的待機処理がない場合にのみ、リソースを取得します。
ExAcquireResourceExclusiveLite を使用して排他的に ERESOURCE を取得します。 このルーチンは、リソースが排他的または共有として取得されていなければ、そのリソースを取得します。
ExConvertExclusiveToSharedLite を使用して、排他取得を共有取得に変換します。
ExReleaseResourceLite を使用して取得したリソースを解放します。
ExAcquireResourceSharedLite と ExAcquireResourceExclusiveLite の Wait パラメーターは、現在のスレッドが ERESOURCE の取得を待機するかどうかを決定します。 FALSE の値を指定し、ERESOURCE を取得できない場合、このルーチンは FALSE を返します。 TRUE の値を指定した場合は、現在のスレッドが ERESOURCE の適切な待機リストに配置されます。
ERESOURCE 構造体の状態の確認
ドライバーは、次のように、ERESOURCE の現在の状態を確認することもできます。
ExIsResourceAcquiredLite または ExIsResourceAcquiredSharedLite を使用して、ERESOURCE が既に共有または排他的として取得されているかどうかを判断します。 ExIsResourceAcquiredExclusiveLite を使用すると、ERESOURCE が明確に排他的に取得されたかどうかをチェックできます。
ExGetSharedWaiterCount を使用して ERESOURCE の共有待機処理の数を特定し、ExGetExclusiveWaiterCount を使用して ERESOURCE の排他的待機処理の数を特定します。