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
戻り値
なし
解説
このルーチンは、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) |
こちらもご覧ください
ExAcquireResourceExclusiveLite