在Windows 7及更高版本操作系统中,对未经证实的Windows内核API - KeSetAffinityThread()的替代是什么

时间:2013-12-27 00:10:55

标签: kernel windows-kernel

Windows内核中提供了

void KeSetAffinityThread(PKTHREAD pKThread, KAFFINITY cpuAffinityMask)例程,其文档可以在OS / 2内核文档中找到。 Windows仍然在其内核中保留此API。此API可用于设置任何线程的关联掩码。当我们在系统中有超过64个处理器时,我正在寻找方法。

小背景 - 随着Windows 7中处理器组功能的引入,我们再也无法安全地依赖KAFFINITY,因此我无法使用上述API,因为在具有64个以上处理器的系统上运行时代码将不可靠。我无法在MSDN中找到合适的替代品,MSDN提供的API包括KeSetSystemAffinityThreadKeSetSystemGroupAffinityThread,但它不能满足我的目的,因为这些调用仅用于设置调用线程的亲和性。

我还看到一个函数 - SetThreadAffinityMask()来设置任意线程的亲和力,但这是一个用户级例程。我在内核模式中寻找类似的东西。

2 个答案:

答案 0 :(得分:0)

只需使用KeSetSystemAffinityThreadEx

即可

答案 1 :(得分:0)

用户模式SetThreadAffinityMask API调用NtSetInformationThread 你可以在内核模式下做同样的事情:

ULONGLONG affinity = <affinity mask>;
ZwSetInformationThread(hThread, ThreadAffinityMask, &affinity, sizeof(affinity));