Как понять "NTSTATUS", "NT_SUCCESS" typedef в Windows ddk?
Два вопроса:
1.
В "ntdef.h" NTSTATUS определяется следующим образом:
typedef __success(return >= 0) LONG NTSTATUS;
что за чертовщина "__success (return> = 0)"?
2.
В "ntstatus.h" STATUS_SUCCESS определяется как 0.
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth
Но макрос NT_SUCCESS в "ntdef.h":
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
Разве это не должно быть "Status == 0"?
3 ответа
__success - это расширенная аннотация, определенная в SpecStrings_strict.h, которая определяет его следующим образом.
* __success (expr) T f (): указывает, успешно ли выполнялась функция f или * нет. Если true при выходе, все функции функции (как указано * другими аннотациями) должно быть Если false при выходе, вызывающий * не следует ожидать каких-либо гарантий выполнения функции. Если не используется, * функция всегда должна удовлетворять своим гарантиям. Добавлено автоматически * функции, которые указывают на успех стандартными способами, например, возвращая * HRESULT.
Причина того, что NT_SUCCESS
не делает строгий тест против STATUS_SUCCESS (0)
вероятно, что другие коды, такие как STATUS_PENDING
на самом деле не неудачи.
Фрагмент __success(return >= 0)
является аннотацией SAL, которая дает подсказку инструменту PreFast о том, какова предполагаемая семантика макроса. Это используется для статического анализа и выявления потенциальных ошибок.
NT_SUCCESS
макро тесты для >= 0
потому что есть коды успеха, кроме STATUS_SUCCESS
, Некоторые коды успеха включают дополнительную информацию о результате операции, хотя на данный момент я могу думать только о S_FALSE
, который уведомляет вызывающего абонента о том, что операция прошла успешно, но результат оказался ложным. Как правило, коды успеха равны или превышают ноль, а коды ошибок меньше нуля.
[Строго говоря, S_FALSE
является HRESULT
не NT_STATUS
хотя эти два типа имеют одинаковый размер и сходные условные обозначения.]
__success хорошо описан здесь.
Ответ 2 - Нет, все положительные коды не являются ошибками. Они могут означать что-то, кроме ОК.