Как понять "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 - Нет, все положительные коды не являются ошибками. Они могут означать что-то, кроме ОК.

Другие вопросы по тегам