次の方法で共有


KeRevertToUserGroupAffinityThread 関数 (wdm.h)

KeRevertToUserGroupAffinityThread ルーチンは、スレッドが作成された時点で、呼び出し元のスレッドのグループ アフィニティを元の値に復元します。

構文

void KeRevertToUserGroupAffinityThread(
  [in] PGROUP_AFFINITY PreviousAffinity
);

パラメーター

[in] PreviousAffinity

復元するグループ アフィニティへのポインター。 このパラメーターは、グループ番号とアフィニティ マスクを含む GROUP_AFFINITY 構造体を指します。 アフィニティ マスクは、ユーザー スレッドが実行できる論理プロセッサのセットを指定します。

戻り値

何一つ

備考

このルーチンは、呼び出し元スレッドのグループ番号とグループ相対アフィニティ マスクを変更します。 グループ番号とアフィニティ マスクは、スレッドを実行できるプロセッサのセットを識別します。 成功した場合、ルーチンは、このセット内のプロセッサで実行するスレッドをスケジュールします。

PreviousAffinity パラメーターは、スレッドの新しいグループ番号 (グループ メンバー) とアフィニティ マスク (Mask メンバー) を指定する GROUP_AFFINITY 構造体を指します。 PreviousAffinity ->Mask が 0 以外場合、KeRevertToUserGroupAffinityThread 呼び出し元スレッドのグループ番号とアフィニティ マスクを構造体内の値に設定します。 PreviousAffinity ->Maskがゼロの場合、ルーチンは、スレッドの初期化時にグループ番号とアフィニティ マスクを元の値に復元します。

プロセスは、一度に複数のグループに対してアフィニティを持つことができます。 ただし、スレッドはいつでも 1 つのグループにのみ割り当てることができ、そのグループは常にスレッドのプロセスのアフィニティ内にあります。

スレッドは、KeSetSystemGroupAffinityThread ルーチンを呼び出すことによって、割り当てられているグループを変更できます。 KeSetSystemGroupAffinityThread する 1 つ以上の呼び出しの後、スレッドは、KeRevertToUserGroupAffinityThread 呼び出すことによって、スレッドが作成されたときに持っていた元のグループ アフィニティを復元できます。

スレッドが作成された後、KeRevertToUserGroupAffinityThread の呼び出しは、最初に KeSetSystemGroupAffinityThread 呼び出さない限り、影響はありません (つまり、スレッドのグループ番号とアフィニティ マスクは変更されません)。 KeRevertToUserGroupAffinityThread 呼び出した後、スレッドが最初に KeSetSystemGroupAffinityThread 呼び出さない限り、KeRevertToUserGroupAffinityThread の 2 回目の呼び出しは無効です。

ルーチンは、グループ番号とアフィニティ マスクを、 *PreviousAffinity で指定されている値に変更します。これは、以下が該当する場合のみです。

  • グループ番号は有効です。
  • アフィニティ マスクは有効です (つまり、グループ内の論理プロセッサに対応するマスク ビットのみが設定されます)。
  • アフィニティ マスクで指定されているプロセッサの少なくとも 1 つがアクティブです。
これらの条件のいずれかが満たされていない場合、keRevertToUserGroupAffinityThread 呼び出しても効果はありません。

関連ルーチンである KeRevertToUserAffinityThreadEx 、呼び出し元のスレッドのアフィニティ マスクが変更されますが、このルーチンは、KeRevertToUserGroupAffinityThreadとは異なり、グループ番号を入力パラメーターとして受け取りません。 Windows 7 以降のバージョンの Windows オペレーティング システムでは、KeRevertToUserAffinityThreadEx は、アフィニティ マスクがグループ 0 のプロセッサを参照していることを前提としています。これは、グループをサポートしていない以前のバージョンの Windows でのこのルーチンの動作と互換性があります。 この動作により、KeRevertToUserAffinityThreadEx 呼び出し、グループ指向機能を使用しない既存のドライバーが、2 つ以上のグループを持つマルチプロセッサ システムで正しく実行されるようになります。 ただし、Windows 7 以降のバージョンの Windows オペレーティング システムでグループ指向機能を使用するドライバーは、KeRevertToUserAffinityThreadEx ではなく、KeRevertToUserGroupAffinityThread呼び出す必要があります。

KERevertToUserGroupAffinityThread が IRQL <= APC_LEVEL で呼び出され、呼び出しが成功した場合、新しい (元に戻された) グループ アフィニティが直ちに有効になります。 呼び出しが戻ると、呼び出し元のスレッドは、新しいグループ アフィニティで指定されたプロセッサで既に実行されています。 keRevertToUserGroupAffinityThread が IRQL = DISPATCH_LEVEL で呼び出され、呼び出しが成功した場合、保留中のプロセッサ変更は、呼び出し元が DISPATCH_LEVEL 以下の IRQL を下げるまで延期されます。

必要条件

要件 価値
サポートされる最小クライアント Windows 7 以降のバージョンの Windows で使用できます。
ターゲット プラットフォーム 万国
ヘッダー wdm.h (Ntddk.h、Wdm.h、Ntddk.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (「解説」セクションを参照)。

関連項目

GROUP_AFFINITY

KeRevertToUserAffinityThreadEx

KeSetSystemGroupAffinityThread