Как понять определение типа NTSTATUS, NT_SUCCESS в Windows ddk? - PullRequest
5 голосов
/ 31 июля 2010

Два вопроса:

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 ]

10 голосов
/ 31 июля 2010

__ success - это «Расширенная аннотация», определенная в SpecStrings_strict.h, которая определяет его следующим образом.

*  __success(expr) T f() :  indicates whether function f succeeded or
*  not. If  is true at exit, all the function's guarantees (as given
*  by other annotations) must hold. If  is false at exit, the caller
*  should not expect any of the function's guarantees to hold. If not used,
*  the function must always satisfy its guarantees. Added automatically to
*  functions that indicate success in standard ways, such as by returning an
*  HRESULT.

Причина, по которой NT_SUCCESS не проводит строгой проверки в отношении STATUS_SUCCESS (0), заключается в том, что другие коды, такие как STATUS_PENDING, на самом деле не являются ошибками.

3 голосов
/ 31 июля 2010

Фрагмент __success(return >= 0) является аннотацией SAL, которая дает подсказку инструменту PreFast о том, какова предполагаемая семантика макроса.Это используется для статического анализа и выявления потенциальных ошибок.

Макро-тесты NT_SUCCESS для >= 0, поскольку существуют коды успеха, отличные от STATUS_SUCCESS.Некоторые коды успеха включают дополнительную информацию о результате операции, хотя на данный момент я могу думать только о S_FALSE, который уведомляет вызывающего абонента о том, что операция прошла успешно, но результат был ложным.Как правило, коды успеха равны или превышают ноль, а коды ошибок меньше нуля.

[Строго говоря, S_FALSE - это HRESULT, а не NT_STATUS, хотя дватипы имеют одинаковый размер и сходные условные обозначения.]

1 голос
/ 31 июля 2010

__ Успех хорошо описан dead-link .

Ответ 2 - Нет, все положительные коды не являются сбоямиХотя они могут означать что-то иное, чем ОК.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...