この記事では、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 を使用して取得したリソースを解放します。
ExAcquireResourceSharedLite と ExAcquireResourceExclusiveLite の Wait パラメーターは、現在のスレッドが ERESOURCE の取得を待機するかどうかを決定します。 FALSE の値を指定し、ERESOURCE を取得できない場合、ルーチンは FALSE を返します。 TRUE の値を指定すると、現在のスレッドは ERESOURCE の適切な待機リストに配置されます。
ERESOURCE 構造体の状態を調べる
ドライバーは、次のように、ERESOURCE の現在の状態を確認することもできます。
ExIsResourceAcquiredLite または ExIsResourceAcquiredSharedLite を使用して、ERESOURCE が既に共有または排他的として取得されているかどうかを判断します。 ExIsResourceAcquiredExclusiveLite を使用して、ERESOURCE が特別に排他的に取得されたかどうかを確認します。
ExGetSharedWaiterCount を使用して ERESOURCE の共有待機者の数を確認し、ExGetExclusiveWaiterCount を使用して ERESOURCE の排他的待機者の数を決定します。