使用 NTSTATUS 值
重要
如果您要尋找 NTSTATUS 值對應至對應 Win32 錯誤碼的數據表,請參閱 NTSTATUS 與 Win32 錯誤碼對應。
許多內核模式 標準驅動程式例程 和驅動程序支援例程會使用NTSTATUS類型來傳回值。 此外,驅動程式會在完成 IRP 時,在 IRP 的 IO_STATUS_BLOCK 結構中提供 NTSTATUS 類型的值。 NTSTATUS 類型是在 Ntdef.h 中定義,而系統提供的狀態代碼定義於 Ntstatus.h 中。 (廠商也可以定義私人狀態代碼,儘管它們很少需要。如需詳細資訊,請參閱 定義新的NTSTATUS值。)
NTSTATUS 值分為四種類型:成功值、資訊值、警告和錯誤值。
系統會將許多值指派給每個類型。 測試從例程成功傳回時,常見的錯誤是比較例程的傳回值與STATUS_SUCCESS。 此比較只會檢查其中一個成功值。
測試傳回值時,您應該使用下列其中一個系統提供的巨集(定義於 Ntdef.h 中):
Macro | 描述 |
---|---|
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 巨集檢查傳回值,則此巨集會評估為 TRUE ,如果例程傳回STATUS_SUCCESS,表示沒有錯誤,或傳回信息狀態STATUS_OBJECT_NAME_EXISTS,表示裝置介面已註冊。
另一個範例是,假設驅動程式呼叫 ZwEnumerateKey 來列舉指定登錄機碼的子機碼。 如果NT_SUCCESS巨集評估為 FALSE,可能是因為例程傳回STATUS_INVALID_PARAMETER,這是錯誤碼,或因為傳回的例程STATUS_NO_MORE_ENTRIES,這是警告碼。
作為最後一個範例,假設驅動程式傳送 IRP,導致較低層級的驅動程式從裝置讀取資訊。 如果要求驅動程式指定緩衝區太小而無法接收任何資訊,則較低層級的驅動程式可能會傳回STATUS_BUFFER_TOO_SMALL,這是錯誤碼。 如果第一個驅動程式指定一個緩衝區,可以接收部分但並非全部的要求資訊,則較低層級驅動程式可能會盡可能提供盡可能多的數據來回應,然後傳回STATUS_BUFFER_OVERFLOW,這是警告碼。 如果第一個驅動程式使用NT_SUCCESS或NT_ERROR來測試狀態值不正確,則可能不小心捨棄收到的某些資訊。