使用原生系統服務常式的 Nt 和 Zw 版本

Windows 原生作業系統服務 API 會實作為一組以核心模式執行的常式。 這些常式的名稱開頭為前置詞 NtZw。 核心模式驅動程式可以直接呼叫這些常式。 使用者模式應用程式可以使用系統呼叫來存取這些常式。

有幾個例外狀況,每個原生系統服務常式都有兩個稍有不同的版本,但其名稱不同 例如, NtCreateFileZwCreateFile 的呼叫會執行類似的作業,事實上也是由相同的核心模式系統常式所服務。 針對使用者模式中的系統呼叫,常式的 NtZw 版本行為相同。 針對來自核心模式驅動程式的呼叫,常式的 NtZw 版本會因其處理呼叫端傳遞至常式之參數值的方式而有所不同。

核心模式驅動程式會呼叫原生系統服務常式的 Zw 版本,通知常式參數來自受信任的核心模式來源。 在此情況下,常式會假設它可以安全地使用參數,而不需要先進行驗證。 但是,如果參數可能來自使用者模式來源或核心模式來源,則驅動程式會改為呼叫 Nt 版本的常式,以根據呼叫端執行緒的歷程記錄來判斷參數是否以使用者模式或核心模式產生。 如需常式如何區分使用者模式參數與核心模式參數的詳細資訊,請參閱 PreviousMode

當使用者模式應用程式呼叫原生系統服務常式的 NtZw 版本時,常式一律會將它所接收的參數視為來自不受信任之使用者模式來源的值。 常式會在參數值使用參數之前徹底進行驗證。 尤其是,常式會探查任何呼叫端提供的緩衝區,以確認緩衝區位於有效的使用者模式記憶體中,並且正確地對齊。

原生系統服務常式會對其所接收的參數進行其他假設。 如果常式收到核心模式驅動程式所配置之緩衝區的指標,則常式會假設緩衝區已配置在系統記憶體中,而不是在使用者模式記憶體中。 如果常式收到使用者模式應用程式所開啟的控制碼,常式會在使用者模式控制碼表格中尋找控制碼,而不是在核心模式控制碼表格中尋找。

在少數的情況下,參數值的意義在使用者模式和核心模式之間的呼叫之間會有更大的差異。 例如, ZwNotifyChangeKey 常式 (或其 NtNotifyChangeKey 對應的) 有一組輸入參數( ApcRoutineApcCoNtext),這些參數代表不同的專案,這取決於參數是否來自使用者模式或核心模式來源。 針對使用者模式的呼叫, ApcRoutine 會指向 apc 常式,而 ApcCoNtext 會指向作業系統在呼叫 APC 常式時所提供的內容值。 針對從核心模式進行的呼叫, ApcRoutine 會指向 WORK_QUEUE_ITEM 結構,而 ApcCoNtext 會指定 WORK_QUEUE_ITEM 結構所描述的工作佇列專案類型。

本節包含下列主題:

PreviousMode

程式庫和標頭

Zw 前置詞是什麼意思?

指定存取權限

NtXxx 常式