【问题标题】:What is the replacement for undocumeneted Windows Kernel API - KeSetAffinityThread() in Windows 7 and later OSWindows 7 及更高版本操作系统中未使用的 Windows 内核 API - KeSetAffinityThread() 的替代品是什么
【发布时间】:2014-01-14 14:09:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: kernel windows-kernel


    【解决方案1】:

    【讨论】:

    • 正如我在问题中提到的,KeSetSystemAffinityThreadEx 只能用于设置调用线程的亲和性。但我想设置任意线程的亲和力。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-18
      • 2011-11-17
      • 2011-04-06
      • 2010-11-12
      • 2012-07-27
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多