次の方法で共有


ERESOURCE 構造体とルーチン

この記事では、ERESOURCE 構造体とその構造体を操作するシステム提供ルーチンについて説明します。 ERESOURCE 構造体を使用して、ドライバーに読み取り/書き込みロックを実装できます。

ERESOURCE 構造体

ERESOURCE 構造体は、共有リソースへのアクセスを管理するために使用されます。 複数のスレッド間で共有できるリソースへのアクセスを同期するためのメカニズムを提供します。

ERESOURCE 構造体は不透明です。つまり、そのメンバーはシステム使用のために予約されています。

ERESOURCE のストレージは、非ページ プールから割り当てる必要があります。

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 の現在の状態を確認することもできます。