Sdílet prostřednictvím


Použití hodnot NTSTATUS

Důležité

Pokud hledáte tabulku mapování hodnot NTSTATUS na odpovídající kódy chyb Win32, přečtěte si článek NTSTATUS na Mapování kódu chyby Win32.

Mnoho standardních rutin ovladačů v režimu jádra a rutin podpory ovladačů používá typ NTSTATUS pro návratové hodnoty. Kromě toho ovladače poskytují hodnotu typu NTSTATUS ve struktuře IO_STATUS_BLOCK IRP při dokončování IRP. Typ NTSTATUS je definován v ntdef.h a stavové kódy zadané systémem jsou definovány v Ntstatus.h. (Dodavatelé mohou také definovat privátní stavové kódy, i když zřídka potřebují. Další informace naleznete v tématu Definování nových hodnot NTSTATUS.)

Hodnoty NTSTATUS jsou rozděleny do čtyř typů:

  • Hodnoty úspěchu
  • Informační hodnoty
  • Warnings
  • Chybové hodnoty

Každému typu je přiřazeno mnoho hodnot. Běžnou chybou při testování úspěšného návratu z rutiny je porovnání návratové hodnoty rutiny s STATUS_SUCCESS. Toto porovnání kontroluje pouze jednu z několika hodnot úspěchu.

Při testování návratové hodnoty byste měli použít jedno z následujících systémově zadaných maker (definovaných v ntdef.h):

Makro Popis
NT_SUCCESS(Status) Vyhodnotí se jako PRAVDA , pokud návratová hodnota zadaná stavem je typ úspěchu (0 – 0x3FFFFFFF) nebo informační typ (0x40000000 – 0x7FFFFFFF).
NT_INFORMATION(Status) Vyhodnotí hodnotu PRAVDA , pokud návratová hodnota zadaná stavem je informační typ (0x40000000 – 0x7FFFFFFF).
NT_WARNING(Status) Vyhodnotí se jako PRAVDA , pokud návratová hodnota zadaná stavem je typ upozornění (0x80000000 – 0xBFFFFFFF).
NT_ERROR(Status) Vyhodnotí se jako PRAVDA , pokud návratová hodnota zadaná stavem je typ chyby (0xC0000000 – 0xFFFFFFFF).

Předpokládejme například, že ovladač volá IoRegisterDeviceInterface k registraci rozhraní zařízení. Pokud ovladač zkontroluje návratovou hodnotu pomocí makra NT_SUCCESS, makro se vyhodnotí jako PRAVDA , pokud rutina vrátí STATUS_SUCCESS, což značí žádné chyby nebo pokud vrátí informační stav STATUS_OBJECT_NAME_EXISTS, což značí, že rozhraní zařízení je již zaregistrované.

Jako další příklad předpokládejme, že ovladač volá ZwEnumerateKey k vytvoření výčtu podklíčů zadaného klíče registru. Pokud se makro NT_SUCCESS vyhodnotí jako NEPRAVDA, může to být proto, že procedura vrátila STATUS_INVALID_PARAMETER, což je chybový kód, nebo proto, že procedura vrátila STATUS_NO_MORE_ENTRIES, což je varovný kód.

Předpokládejme jako poslední příklad, že ovladač odešle IRP, který způsobí, že ovladač nižší úrovně bude číst informace ze zařízení. Pokud žádající ovladač určuje vyrovnávací paměť, která je příliš malá na příjem jakýchkoli informací, ovladač nižší úrovně může reagovat vrácením STATUS_BUFFER_TOO_SMALL, což je kód chyby. Pokud první ovladač určuje vyrovnávací paměť, která může přijímat některé, ale ne všechny požadované informace, ovladač nižší úrovně může reagovat tak, že zadá co nejvíce dat a pak vrátí STATUS_BUFFER_OVERFLOW, což je kód upozornění. Pokud první ovladač testuje stavovou hodnotu pomocí NT_SUCCESS nebo NT_ERROR nesprávně, může neúmyslně odstranit některé přijaté informace.