KeSetSystemAffinityThreadEx 関数 (wdm.h)
KeSetSystemAffinityThreadEx ルーチンは、現在のスレッドのシステム アフィニティを設定します。
構文
KAFFINITY KeSetSystemAffinityThreadEx(
[in] KAFFINITY Affinity
);
パラメーター
[in] Affinity
現在のスレッドの新しいシステム アフィニティを指定する KAFFINITY 型の変数。
戻り値
KeSetSystemAffinityThreadEx は、現在のスレッドの以前のシステム アフィニティを返すか、以前のシステム アフィニティがないことを示す 0 を返します。
注釈
KeSetSystemAffinityThreadEx は 、現在のスレッドのアフィニティ マスクを変更します。 アフィニティ マスクは、スレッドを実行できるプロセッサのセットを識別します。 成功した場合、ルーチンは、このセット内のプロセッサで実行するようにスレッドをスケジュールします。
KeSetSystemAffinityThreadEx の呼び出し元は戻り値を保存し、後でこの値を KeRevertToUserAffinityThreadEx ルーチンに渡して、前のアフィニティ マスクを復元する必要があります。
マルチプロセッサ システムでは、ユーザー モード スレッドのコンテキストで実行されるカーネル モード ドライバー ルーチンで、スレッドのアフィニティ マスクを一時的に変更するために KeSetSystemAffinityThreadEx を呼び出す必要がある場合があります。 ルーチンが終了する前に、 KeRevertToUserAffinityThreadEx を呼び出して、スレッドのアフィニティ マスクを元の値に復元する必要があります。
ユーザー アフィニティという用語は、ユーザー モード スレッドの元のアフィニティを指します。 カーネル モード ドライバーによって設定されるアフィニティは、 システム アフィニティと呼ばれます。 KeSetSystemAffinityThreadEx を呼び出すと、スレッドのユーザー アフィニティがシステム アフィニティに置き換えられると、呼び出しは 0 を返します。 その後、ドライバーは KeRevertToUserAffinityThreadEx を呼び出し、この戻り値 (0) を Affinity 値として渡すことによって、ユーザー アフィニティを復元します。
さらに、特定のアフィニティ マスクを必要とするカーネル モード ドライバー ルーチンは、別のアフィニティ マスクを必要とする別のカーネル モード ルーチンを呼び出す可能性があります。 各ルーチンは 、KeSetSystemAffinityThreadEx を呼び出して新しいアフィニティ マスクを設定し、 KeRevertToUserAffinityThreadEx を呼び出して、戻る前に前のアフィニティ マスクを復元できます。
KeSetSystemAffinityThreadEx ルーチンは、次の両方が true の場合にのみ、現在のスレッドのアフィニティ マスクを Affinity 値に変更します。
- Affinity 値は有効です (つまり、論理プロセッサに対応するマスク ビットのみが設定されます)。
- Affinity 値で指定されているプロセッサの少なくとも 1 つがアクティブです。
Windows 7 以降のバージョンの Windows では、プロセッサ グループがサポートされています。 プロセッサ グループに関する情報を処理するように設計されたドライバーでは、 KeSetSystemAffinityThreadEx ではなく、プロセッサ グループを指定する KeSetSystemGroupAffinityThread ルーチンを使用する必要があります。 ただし、Windows 7 以降のバージョンの Windows での KeSetSystemAffinityThreadEx の実装では、プロセッサ グループをサポートしていない以前のバージョンの Windows 用に作成されたドライバーとの互換性が提供されます。 この実装では、 KeSetSystemAffinityThreadEx はスレッドをグループ 0 に割り当て、アフィニティ マスクを使用して、スレッドを実行できるこのグループ内の論理プロセッサのセットを指定します。 ルーチンは、前のグループ相対アフィニティ マスクを返しますが、前のグループは返しません。
KESetSystemAffinityThreadEx が IRQL <= APC_LEVEL で呼び出され、呼び出しが成功した場合、新しいアフィニティ マスクはすぐに有効になります。 呼び出しが返されると、呼び出し元のスレッドは、新しいアフィニティ マスクで指定されたプロセッサで既に実行されています。 KESetSystemAffinityThreadEx が IRQL = DISPATCH_LEVEL で呼び出され、呼び出しが成功した場合、保留中のプロセッサの変更は、呼び出し元が IRQL を下げるまで延期DISPATCH_LEVEL。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista 以降のバージョンの Windows で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (「解説」セクションを参照)。 |