次の方法で共有


ExAcquireSharedWaitForExclusive 関数 (wdm.h)

ExAcquireSharedWaitForExclusive ルーチンは、共有アクセスを許可でき、排他的なウェイターがない場合に、共有アクセス用に指定されたリソースを取得します。

構文

BOOLEAN ExAcquireSharedWaitForExclusive(
  [in, out] PERESOURCE Resource,
  [in]      BOOLEAN    Wait
);

パラメーター

[in, out] Resource

共有アクセス用に取得するリソースへのポインター。

[in] Wait

リソースをすぐに取得できない場合のルーチンの動作を指定します。 TRUE の場合、呼び出し元はリソースを取得できるようになるまで待機状態になります。 FALSE の場合、リソースを取得できるかどうかに関係なく、ルーチンは直ちにを返します。

戻り値

ExAcquireSharedWaitForExclusive は、要求されたアクセス権が付与されている場合、または排他的所有者がリソースを解放した場合に TRUE を 返します。 入力 WaitFALSE で、共有アクセスをすぐに許可できない場合、このルーチンは FALSE を返します。

注釈

ほとんどのドライバーでは、 ExAcquireSharedWaitForExclusive の代わりに ExAcquireResourceSharedLite を使用する必要があります。

呼び出し元は、 ExReleaseResourceLite または ExReleaseResourceForThreadLite を呼び出すことによって、リソースを解放できます。

共有アクセスをすぐに許可できない場合、呼び出し元は他のスレッドがリソースの排他的所有権を取得して解放するのを待つことができます。

呼び出し元に特定のリソースへの共有アクセス権が付与されるかどうかは、次の条件によって異なります。

  • リソースが現在所有されていない場合は、現在のスレッドに対してすぐに共有アクセスが許可されます。
  • 呼び出し元が既にリソースへの排他アクセス権を持っている場合、現在のスレッドには同じ種類のアクセスが再帰的に付与されます。
  • リソースが現在共有として所有されていて、排他的アクセスを取得する保留中の試行がない場合、共有アクセスはすぐに呼び出し元に付与されます。
  • リソースが現在共有として所有されているが、排他的アクセスの取得が保留中の場合、呼び出し元は待機状態 (TRUE に設定されている待機) または ExAcquireSharedWaitForExclusiveFALSE を返します。

    現在のスレッドが保留中の排他的所有権が解放されるまでリソースの取得を待機すると、現在のスレッドにリソースへの共有アクセスが許可され、実行が再開されると、 ExAcquireSharedWaitForExclusiveTRUE を 返します。

ExAcquireSharedWaitForExclusive の動作は、呼び出し元のスレッドが既にリソースを共有として所有しており、排他的なウェイターがない限り、ExAcquireResourceSharedLite の動作と同じです。 その場合、 ExAcquireSharedWaitForExclusive を使用すると、排他的ウェイターはリソースの排他的所有権を取得できます。

呼び出し元が 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)

こちらもご覧ください

ExAcquireResourceSharedLite

ExAcquireSharedStarveExclusive

ExConvertExclusiveToSharedLite

ExGetExclusiveWaiterCount

ExIsResourceAcquiredExclusiveLite

ExIsResourceAcquiredSharedLite

ExReleaseResourceForThread