2010-07-31 8 views
5

due domande:Come capire il typedef "NTSTATUS", "NT_SUCCESS" in windows ddk?

1.

In "ntdef.h" il NTSTATUS è definito come segue:

typedef __success(return >= 0) LONG NTSTATUS; 

cosa diavolo è il "__success (ritorno> = 0) "?

2.

In "ntstatus.h", STATUS_SUCCESS è definito a 0.

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

Ma la NT_SUCCESS macro in "ntdef.h" è:

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

Non dovrebbe essere "Stato == 0"?

risposta

10

__successo è una "Annotazione avanzata" definita in SpecStrings_strict.h, che la definisce come segue.

 
* __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 ragione per cui NT_SUCCESS non fa una prova rigorosa contro STATUS_SUCCESS (0) è probabilmente che altri codici come STATUS_PENDING non sono in realtà fallimenti.

1

__successo è descritto correttamente here.

La risposta a 2 è No, tutti i codici positivi non sono guasti. Possono significare qualcosa di diverso da OK però.

3

Il frammento __success(return >= 0) è un'annotazione SAL, che fornisce un indizio dello strumento PreFast su quale sia la semantica desiderata della macro. Questo è usato per fare analisi statiche e identificare potenziali bug.

I macro test NT_SUCCESS per >= 0 perché esistono codici di successo diversi da STATUS_SUCCESS. Alcuni codici di successo includono informazioni aggiuntive sull'esito dell'operazione, anche se al momento posso solo pensare a S_FALSE, che notifica al chiamante che l'operazione è riuscita, ma il risultato è stato falso. Di norma, i codici di successo sono uguali o maggiori di zero e i codici di errore sono inferiori a zero.

[A rigor di termini, S_FALSE è un HRESULT, non un NT_STATUS, anche se i due tipi hanno la stessa dimensione e convenzioni simili.]