次の方法で共有


KeRevertToUserGroupAffinityThread 関数 (wdm.h)

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

構文

void KeRevertToUserGroupAffinityThread(
  [in] PGROUP_AFFINITY PreviousAffinity
);

パラメーター

[in] PreviousAffinity

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

戻り値

なし

解説

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

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

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

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

スレッドが作成された後、スレッドが最初に KeSetSystemGroupAffinityThread を呼び出さない限り、KeRevertToUserGroupAffinityThread の呼び出しは影響を与えなくなります (つまり、スレッドのグループ番号とアフィニティ マスクは変更されません)。 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 で呼び出され、呼び出しが成功した場合、呼び出し元が以下の IRQL を下げるまで保留中のプロセッサの変更は延期DISPATCH_LEVEL。

要件

要件
サポートされている最小のクライアント Windows 7 以降のバージョンの Windows で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Ntddk.h、Wdm.h、Ntddk.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (「解説」セクションを参照)。

こちらもご覧ください

GROUP_AFFINITY

KeRevertToUserAffinityThreadEx

KeSetSystemGroupAffinityThread