ExSetResourceOwnerPointerEx 関数 (wdm.h)

ExSetResourceOwnerPointerEx ルーチンは、エグゼクティブ リソースの所有権を呼び出し元のスレッドから所有者ポインター (リソース所有者を識別するシステム アドレス) に転送します。

構文

void ExSetResourceOwnerPointerEx(
  [in, out] PERESOURCE Resource,
  [in]      PVOID      OwnerPointer,
  [in]      ULONG      Flags
);

パラメーター

[in, out] Resource

呼び出し元のスレッドが所有するエグゼクティブ リソース (不透明な ERESOURCE 構造体) へのポインター。 呼び出し元は、以前にこの構造体を割り当て、 ExInitializeResourceLite ルーチンを呼び出して初期化しました。 詳細については、「解説」を参照してください。

[in] OwnerPointer

リソース所有者を識別するポインター値。 このパラメーター値は、通常、ERESOURCE_THREAD型の値へのポインターですが、PVOID 型にキャストされます。 呼び出し元は、このポインター値の 2 つの最下位ビットを 1 に設定する必要があります。 詳細については、「解説」を参照してください。

[in] Flags

このルーチンの操作を変更できるフラグのセット。 このパラメーターを 0 または次のフラグ値に設定します。

  • FLAG_OWNER_POINTER_IS_THREAD
Flags = FLAG_OWNER_POINTER_IS_THREADの場合、OwnerPointer は、不透明なスレッド オブジェクトへのポインターである ERESOURCE_THREAD 型の値を指す必要があります。 Flags = 0 の場合、OwnerPointer は、リソースが解放されるまで割り当てられたままのシステム メモリ内のストレージ オブジェクトを指す必要があります。 詳細については、「解説」を参照してください。

戻り値

なし

解説

このルーチンは、Windows 7 以降のバージョンの Windows オペレーティング システムで使用できます。

ExSetResourceOwnerPointerEx を使用すると、リソース マネージャーとして機能するスレッドは、スレッドが既に取得したエグゼクティブ リソースの所有権を別のスレッドに転送し、リソースを使用できます。 エグゼクティブ リソースは、 ERESOURCE 構造体で表されます。

呼び出し元は 、OwnerPointer パラメーター値の 2 つの最下位ビットを 1 に設定する必要があります。 オペレーティング システムは、これらのビットを内部的に使用して、 ExSetResourceOwnerPointerEx 呼び出しによって設定された所有者ポインターを、 ExAcquireResourceExclusiveLite または ExAcquireResourceSharedLite ルーチンを呼び出してリソースを取得したスレッドから区別します。

リソースの所有権を転送するために ExSetResourceOwnerPointerEx を呼び出すスレッドは、リソースを取得するために ExAcquireResourceXxxLite ルーチンを以前に呼び出したスレッドと同じである必要があります。

リソース マネージャー スレッドが排他的アクセスのためにリソースを取得した場合 ( ExAcquireResourceExclusiveLite を呼び出すことによって)、 ExSetResourceOwnerPointerEx 呼び出しは、排他的アクセス所有権をリソース ユーザー スレッドに転送します。 リソース マネージャー スレッドが ( ExAcquireResourceSharedLite を呼び出して) 共有アクセス用のリソースを取得した場合、 ExSetResourceOwnerPointerEx 呼び出しは、共有アクセス所有権をリソース ユーザー スレッドに転送します。

リソース ユーザー スレッドにリソースが不要になったら、リソースを解放する必要があります。 通常、リソース ユーザー スレッドはリソースを解放します。 そのためには、 ExReleaseResourceForThreadLite ルーチンを呼び出す必要があります。 この呼び出しでは、ThreadId パラメーターの値は、リソースの所有権を転送した前の ExSetResourceOwnerPointerEx 呼び出しの OwnerPointer パラメーター (下位 2 つのビットを含む) の値と一致する必要があります。

ExSetResourceOwnerPointerEx 呼び出しがリソースの所有権を転送した後、ドライバーが指定したリソースに対して呼び出すことができる他の ERESOURCE ルーチン、ExReleaseResourceForThreadLite だけです。 このリソースに対して ExReleaseResourceLite などの別の ERESOURCE ルーチンを呼び出そうとすると、エラーになります。

ExSetResourceOwnerPointerEx は、2 つの大きく異なるモードで動作できます。 モードは Flags パラメーターで指定します。 2 つのモードの汎用性を高めるために、[ フラグ ] = [FLAG_OWNER_POINTER_IS_THREAD] を設定します。 この Flags 値は、 OwnerPointer パラメーターが resource-manager スレッドのスレッド オブジェクトへのポインターであることをオペレーティング システムに通知します。 オペレーティング システムは、必要に応じて、この情報を使用して、このスレッドの優先度を一時的に上げ、優先度の反転を回避できます。 OwnerPointer 値に使用するスレッド オブジェクト ポインターを取得するために、ドライバーは ExGetCurrentResourceThread ルーチンを呼び出すことができます。 OwnerPointer 値の 2 つの最下位ビットを 1 に設定することを忘れないでください。

Flags が 0 の場合、ExSetResourceOwnerPointerEx の動作は、Windows 2000 以降のバージョンの Windows オペレーティング システムで使用できる従来の ExSetResourceOwnerPointer ルーチンの動作と同じです。 つまり、 OwnerPointer パラメーターは、リソース マネージャー スレッドが ExSetResourceOwnerPointerEx を呼び出す前にシステム メモリに割り当てるストレージ オブジェクトを指します。 この場合、 ExSetResourceOwnerPointerEx はオブジェクト自体へのアクセスを試みないため、オブジェクトの種類と値は関係ありません。 代わりに、ルーチンは単に オブジェクトのメモリ アドレスを使用してリソース所有者を識別します。 オブジェクトのストレージは、メモリ内の偶数の 4 バイト境界から開始する必要があります。 2 つのドライバーが誤って同じ所有者ポインターを同時に使用しないようにするには、リソース マネージャー スレッドは、リソースが解放されるまで、オブジェクトのストレージを解放しないでください。

エグゼクティブ リソースの管理の詳細については、「 ERESOURCE ルーチンの概要」を参照してください。

要件

要件
サポートされている最小のクライアント Windows 7 以降のバージョンの Windows オペレーティング システムで使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport)

こちらもご覧ください

ERESOURCE

ExAcquireResourceExclusiveLite

ExAcquireResourceSharedLite

ExGetCurrentResourceThread

ExInitializeResourceLite

ExReleaseResourceForThreadLite

ExReleaseResourceLite

ExSetResourceOwnerPointer