使用 NTSTATUS 值

注意

如果您要尋找 NTSTATUS 值對應至對應 Win32 錯誤碼的資料表,請參閱 NTSTATUS 到 Win32 錯誤碼對應

許多核心模式 標準驅動程式常式 和驅動程式支援常式都會使用 NTSTATUS 類型來傳回值。 此外,驅動程式會在完成 IRP時,在 IRP的IO_STATUS_BLOCK結構中提供 NTSTATUS 類型的值。 NTSTATUS 類型定義于 Ntdef.h 中,而系統提供的狀態碼定義于 Ntstatus.h 中。 (廠商也可以定義私人狀態碼,雖然它們很少需要。如需詳細資訊,請參閱 定義新的 NTSTATUS 值。)

NTSTATUS 值分成四種類型:成功值、參考值、警告和錯誤值。

系統會將許多值指派給每個類型。 測試從常式成功傳回時,常見的錯誤是比較常式的傳回值與STATUS_SUCCESS。 此比較只會檢查數個成功值的其中一個。

測試傳回值時,您應該使用 Ntdef.h) 中定義的下列其中一個系統提供的宏 (:

NT_SUCCESS (狀態)
如果Status所指定的傳回值是成功類型 (0 - 0x3FFFFFFF) 或資訊型別 (0x40000000 0x7FFFFFFF) ,則評估為TRUE

NT_INFORMATION (狀態)
如果Status所指定的傳回值是資訊型別 (0x40000000 - 0x7FFFFFFF) ,評估為TRUE

NT_WARNING (狀態)
如果Status所指定的傳回值是警告類型 (0x80000000 - 0xBFFFFFFF) ,評估為TRUE

NT_ERROR (狀態)
如果Status所指定的傳回值是錯誤類型 (0xC0000000 -0xFFFFFFFF) ,評估為TRUE

例如,假設驅動程式呼叫 IoRegisterDeviceInterface 來註冊裝置介面。 如果驅動程式使用 NT_SUCCESS 宏檢查傳回值,則如果常式傳回STATUS_SUCCESS,表示沒有錯誤,或傳回參考狀態STATUS_OBJECT_NAME_EXISTS,則宏會評估為 TRUE ,這表示裝置介面已註冊。

另一個範例是,假設驅動程式呼叫 ZwEnumerateKey 來列舉指定登錄機碼的子機碼。 如果NT_SUCCESS宏評估為 FALSE,可能是因為常式傳回STATUS_INVALID_PARAMETER,也就是錯誤碼,或因為常式傳回STATUS_NO_MORE_ENTRIES,也就是警告碼。

最後一個範例是,假設驅動程式會傳送 IRP,讓較低層級的驅動程式從裝置讀取資訊。 如果要求驅動程式指定的緩衝區太小而無法接收任何資訊,則較低層級驅動程式可能會傳回STATUS_BUFFER_TOO_SMALL來回應,這是錯誤碼。 如果第一個驅動程式指定可接收部分但並非所有要求資訊的緩衝區,則較低層級驅動程式可能會藉由提供盡可能的資料來回應,然後傳回STATUS_BUFFER_OVERFLOW,這是警告碼。 請注意,如果第一個驅動程式使用NT_SUCCESS或NT_ERROR不正確測試狀態值,它可能會不小心捨棄收到的部分資訊。