KeSetSystemAffinityThreadEx 函式 (wdm.h)

KeSetSystemAffinityThreadEx 例程會設定目前線程的系統親和性。

語法

KAFFINITY KeSetSystemAffinityThreadEx(
  [in] KAFFINITY Affinity
);

參數

[in] Affinity

KAFFINITY 型別變數,指定目前線程的新系統親和性。

傳回值

KeSetSystemAffinityThreadEx 會傳回目前線程的先前系統親和性,或零表示沒有先前的系統親和性。

備註

KeSetSystemAffinityThreadEx 會變更目前線程的親和性遮罩。 親和性遮罩會識別線程可執行的一組處理器。 如果成功,例程會將線程排程在此集合中的處理器上執行。

KeSetSystemAffinityThreadEx 的呼叫端應該儲存傳回值,稍後將此值傳遞至 KeRevertToUserAffinityThreadEx 例程,以還原先前的親和性遮罩。

在多處理器系統中,在使用者模式線程內容中執行的內核模式驅動程式例程可能需要呼叫 KeSetSystemAffinityThreadEx ,以暫時變更線程的親和性遮罩。 在例程結束之前,它應該呼叫 KeRevertToUserAffinityThreadEx ,將線程的親和性遮罩還原為其原始值。

用戶親和性一詞是指使用者模式線程的原始親和性。 核心模式驅動程式所設定的親和性稱為 系統親和性。 如果呼叫 KeSetSystemAffinityThreadEx 會以系統親和性取代線程的用戶親和性,則呼叫會傳回零。 稍後,驅動程式會呼叫 KeRevertToUserAffinityThreadEx ,並將這個傳回值傳遞 (零) 做為 Affinity 值,以還原用戶親和性。

此外,需要特定親和性遮罩的核心模式驅動程式例程可能會呼叫另一個需要不同親和性遮罩的核心模式例程。 每個例程都可以呼叫 KeSetSystemAffinityThreadEx 來設定新的親和性遮罩,然後呼叫 KeRevertToUserAffinityThreadEx ,以在傳回之前還原先前的親和性遮罩。

KeSetSystemAffinityThreadEx 例程只有在下列兩者都成立時,才會將目前線程的親和性遮罩變更為 Affinity 值:

  • Affinity 值是有效的 (,也就是說,只會設定對應至邏輯處理器的遮罩位) 。
  • 在 Affinity 值中指定的處理器中至少有一個為使用中。
如果不符合上述任一條件, 則對 KeSetSystemAffinityThreadEx 的呼叫沒有任何作用。

Windows 7 和更新版本的 Windows 支援處理器群組。 設計用來處理處理器群組相關信息的驅動程序應該使用 KeSetSystemGroupAffinityThread 例程,這個例程會指定處理器群組,而不是未指定處理器群組的 KeSetSystemAffinityThreadEx。 不過,在 Windows 7 和更新版本的 Windows 中實作 KeSetSystemAffinityThreadEx ,可為舊版 Windows 所撰寫的驅動程式提供相容性,這些驅動程式不支援處理器群組。 在此實作中, KeSetSystemAffinityThreadEx 會將線程指派給群組 0,並使用同質遮罩來指定此群組中可執行線程的一組邏輯處理器。 例程會傳回先前的群組相對親和性遮罩,但不會傳回上一個群組。

如果在 IRQL <= APC_LEVEL呼叫 KeSetSystemAffinityThreadEx 且呼叫成功,則新的親和性遮罩會立即生效。 當呼叫傳回時,呼叫線程已在新的同質遮罩中指定的處理器上執行。 如果在 IRQL = DISPATCH_LEVEL呼叫 KeSetSystemAffinityThreadEx ,而且呼叫成功,則擱置的處理器變更會延後,直到呼叫端降低下方的 IRQL DISPATCH_LEVEL為止。

規格需求

需求
最低支援的用戶端 可在 Windows Vista 和更新版本的 Windows 中使用。
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (请参阅一节) 。

另請參閱

KAFFINITY

KeRevertToUserAffinityThreadEx

KeSetSystemAffinityThread

KeSetSystemGroupAffinityThread