2010-07-31 4 views
5

Deux questions:Comment comprendre le "NTSTATUS", "NT_SUCCESS" typedef dans Windows ddk?

1.

Dans "ntdef.h" le NTSTATUS est défini comme suit:

typedef __success(return >= 0) LONG NTSTATUS; 

ce que l'enfer est le « __success (retour> = 0) "?

2.

Dans "ntstatus.h", STATUS_SUCCESS est définie à 0.

#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth 

Mais la NT_SUCCESS macro dans "ntdef.h" est:

#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) 

Cela ne devrait-il pas être "Statut == 0"?

Répondre

10

__success est une "Annotation Avancée" définie dans SpecStrings_strict.h, qui la définit comme suit.

 
* __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. 

La raison pour laquelle NT_SUCCESS ne fait pas un test strict contre STATUS_SUCCESS (0) est sans doute que d'autres codes comme STATUS_PENDING ne sont pas réellement des échecs.

1

__success est décrit joliment here.

La réponse à 2 est Non, tous les codes positifs sont des échecs. Ils peuvent vouloir dire autre chose que OK.

3

Le fragment __success(return >= 0) est une annotation SAL, qui donne un indice à l'outil PreFast sur la signification de la sémantique voulue de la macro. Ceci est utilisé pour effectuer une analyse statique et identifier les bogues potentiels.

La macro NT_SUCCESS teste >= 0 car il existe des codes de succès autres que STATUS_SUCCESS. Certains codes de réussite incluent des informations supplémentaires sur le résultat de l'opération, bien que pour le moment, je ne peux que penser à S_FALSE, qui informe l'appelant que l'opération a réussi, mais le résultat était faux. En règle générale, les codes de réussite sont égaux ou supérieurs à zéro et les codes d'échec sont inférieurs à zéro.

[à proprement parler, S_FALSE est un HRESULT, pas NT_STATUS, bien que les deux types ont la même taille et des conventions similaires.]