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 を使用して取得したリソースを解放します。

ExAcquireResourceSharedLiteExAcquireResourceExclusiveLiteWait パラメーターは、現在のスレッドが ERESOURCE の取得を待機するかどうかを決定します。 FALSE の値を指定し、ERESOURCE を取得できない場合、このルーチンは FALSE を返します。 TRUE の値を指定した場合は、現在のスレッドが ERESOURCE の適切な待機リストに配置されます。

ERESOURCE 構造体の状態の確認

ドライバーは、次のように、ERESOURCE の現在の状態を確認することもできます。