KeRevertToUserGroupAffinityThread 函数 (wdm.h)
KeRevertToUserGroupAffinityThread 例程将调用线程的组相关性还原到创建线程时的原始值。
语法
void KeRevertToUserGroupAffinityThread(
[in] PGROUP_AFFINITY PreviousAffinity
);
参数
[in] PreviousAffinity
指向要还原的组相关性的指针。 此参数指向包含组号和关联掩码 的GROUP_AFFINITY 结构。 关联掩码指定用户线程可以运行的逻辑处理器集。
返回值
无
备注
此例程更改调用线程的组号和组相对关联掩码。 组号和关联掩码标识线程可以在其上运行的一组处理器。 如果成功,例程会将线程计划为在此集中的处理器上运行。
PreviousAffinity 参数指向一个GROUP_AFFINITY结构,该结构指定 (组成员) 的新组号和关联掩码 (屏蔽线程的 Mask 成员) 。 如果 PreviousAffinity-Mask> 为非零值,则 KeRevertToUserGroupAffinityThread 会将调用线程的组号和关联掩码设置为 结构中的值。 如果 PreviousAffinity-Mask> 为零,则例程会将组号和关联掩码还原到初始化线程时的原始值。
一个进程一次可以具有多个组的相关性。 但是,一个线程在任何时候只能分配给一个组,并且该组始终与线程的进程关联。
线程可以通过调用 KeSetSystemGroupAffinityThread 例程更改分配给它的组。 在对 KeSetSystemGroupAffinityThread 进行一次或多次调用之后,线程可以通过调用 KeRevertToUserGroupAffinityThread 来还原创建线程时的原始组相关性。
创建线程后,对 KeRevertToUserGroupAffinityThread 的调用不起作用 (也就是说,线程的组号和关联掩码) 保持不变,除非线程首先调用 KeSetSystemGroupAffinityThread。 调用 KeRevertToUserGroupAffinityThread 后,第二次调用 KeRevertToUserGroupAffinityThread 不起作用,除非线程首先调用 KeSetSystemGroupAffinityThread。
仅当以下情况成立时,例程才会将组号和关联掩码更改为 *PreviousAffinity 中指定的值:
- 组号有效。
- 关联掩码是有效的 (也就是说,仅) 设置与组中逻辑处理器对应的掩码位。
- 关联掩码中指定的至少一个处理器处于活动状态。
相关例程 KeRevertToUserAffinityThreadEx 更改调用线程的关联掩码,但此例程与 KeRevertToUserGroupAffinityThread 不同,不接受组号作为输入参数。 在 Windows 7 及更高版本的 Windows 操作系统中, KeRevertToUserAffinityThreadEx 假定关联掩码引用组 0 中的处理器,这与不支持组的早期版本的 Windows 中此例程的行为兼容。 此行为可确保调用 KeRevertToUserAffinityThreadEx 且不使用面向组的功能的现有驱动程序将在具有两个或更多组的多处理器系统中正确运行。 但是,在 Windows 7 及更高版本的 Windows 操作系统中使用任何面向组的功能的驱动程序应调用 KeRevertToUserGroupAffinityThread 而不是 KeRevertToUserAffinityThreadEx。
如果在 IRQL <= APC_LEVEL 调用 KeRevertToUserGroupAffinityThread,并且调用成功,则新 (还原) 组相关性立即生效。 当调用返回时,调用线程已在新组关联中指定的处理器上运行。 如果在 IRQL = DISPATCH_LEVEL调用 KeRevertToUserGroupAffinityThread ,并且调用成功,则挂起的处理器更改将推迟到调用方将 IRQL 降低到DISPATCH_LEVEL以下。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 在 Windows 7 和更高版本的 Windows 中可用。 |
目标平台 | 通用 |
标头 | wdm.h (包括 Ntddk.h、Wdm.h、Ntddk.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (请参阅“备注”部分) 。 |