ExAcquireSharedWaitForExclusive 関数 (wdm.h)
ExAcquireSharedWaitForExclusive ルーチンは、共有アクセスを許可でき、排他的なウェイターがない場合に、共有アクセス用に指定されたリソースを取得します。
構文
BOOLEAN ExAcquireSharedWaitForExclusive(
[in, out] PERESOURCE Resource,
[in] BOOLEAN Wait
);
パラメーター
[in, out] Resource
共有アクセス用に取得するリソースへのポインター。
[in] Wait
リソースをすぐに取得できない場合のルーチンの動作を指定します。 TRUE の場合、呼び出し元はリソースを取得できるようになるまで待機状態になります。 FALSE の場合、リソースを取得できるかどうかに関係なく、ルーチンは直ちにを返します。
戻り値
ExAcquireSharedWaitForExclusive は、要求されたアクセス権が付与されている場合、または排他的所有者がリソースを解放した場合に TRUE を 返します。 入力 Wait が FALSE で、共有アクセスをすぐに許可できない場合、このルーチンは FALSE を返します。
注釈
ほとんどのドライバーでは、 ExAcquireSharedWaitForExclusive の代わりに ExAcquireResourceSharedLite を使用する必要があります。
呼び出し元は、 ExReleaseResourceLite または ExReleaseResourceForThreadLite を呼び出すことによって、リソースを解放できます。
共有アクセスをすぐに許可できない場合、呼び出し元は他のスレッドがリソースの排他的所有権を取得して解放するのを待つことができます。
呼び出し元に特定のリソースへの共有アクセス権が付与されるかどうかは、次の条件によって異なります。
- リソースが現在所有されていない場合は、現在のスレッドに対してすぐに共有アクセスが許可されます。
- 呼び出し元が既にリソースへの排他アクセス権を持っている場合、現在のスレッドには同じ種類のアクセスが再帰的に付与されます。
- リソースが現在共有として所有されていて、排他的アクセスを取得する保留中の試行がない場合、共有アクセスはすぐに呼び出し元に付与されます。
-
リソースが現在共有として所有されているが、排他的アクセスの取得が保留中の場合、呼び出し元は待機状態 (TRUE に設定されている待機) または ExAcquireSharedWaitForExclusive は FALSE を返します。
現在のスレッドが保留中の排他的所有権が解放されるまでリソースの取得を待機すると、現在のスレッドにリソースへの共有アクセスが許可され、実行が再開されると、 ExAcquireSharedWaitForExclusive は TRUE を 返します。
呼び出し元が Wait パラメーターに TRUE を指定した場合、呼び出し元は、ExReleaseResourceForThread を使用して、呼び出し元の代わりに別のスレッドがリソースを解放するまでブロックします。 ドライバーライターは、別のスレッドが実際にリソースを解放するように注意する必要があります。それ以外の場合、呼び出し元はデッドロックされます。 ExAcquireResourceSharedLite にはこのプロパティがないため、 ExAcquireSharedWaitForExclusive の特定の動作を必要としない限り、ドライバーはそのルーチンを使用する必要があります。
このルーチンを呼び出す前に、通常のカーネル APC 配信を無効にする必要があります。 KeEnterCriticalRegion を呼び出して、通常のカーネル APC 配信を無効にします。 リソースが解放されるまで、配信は無効のままにしておく必要があります。その時点で 、KeLeaveCriticalRegion を呼び出して再び有効にすることができます。 詳細については、「 APC の無効化」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
DDI コンプライアンス規則 | HwStorPortProhibitedDDIs(storport)、 IrqlExApcLte3(wdm)、 SpNoWait(storport)、 WithinCriticalRegion(storport)、WithinCriticalRegion(storport)、 WithinCriticalRegion(wdm) |
こちらもご覧ください
ExAcquireSharedStarveExclusive
ExConvertExclusiveToSharedLite
ExIsResourceAcquiredExclusiveLite