Wie zu verstehen, die "NTSTATUS", "NT_SUCCESS" typedef " in windows ddk?
Zwei Fragen:
1.
In "ntdef.h" NTSTATUS ist wie folgt definiert:
typedef __success(return >= 0) LONG NTSTATUS;
was zum Teufel ist die "__Erfolg(return >= 0)"?
2.
In "ntstatus.h", STATUS_SUCCESS ist definiert auf 0.
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) //ntsubauth
Aber die NT_SUCCESS makro in "ntdef.h" ist:
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
Sollte es nicht sein "Status == 0" ?
InformationsquelleAutor ZhengZhiren | 2010-07-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
__Erfolg ist eine "Erweiterte Annotation" definiert SpecStrings_strict.h, der definiert es wie folgt.
Dem Grund, dass
NT_SUCCESS
nicht einen strengen test gegenSTATUS_SUCCESS (0)
ist wahrscheinlich, dass andere codes wieSTATUS_PENDING
sind nicht wirklich Fehler.InformationsquelleAutor torak
Fragment
__success(return >= 0)
ist ein SAL-Anmerkung, die gibt einen Hinweis auf das PreFast tool über das, was die beabsichtigte Semantik der Makros sind. Diese wird verwendet, um statische Analyse und das erkennen möglicher Fehler.Den
NT_SUCCESS
makro-tests für>= 0
weil es erfolgscodes andere alsSTATUS_SUCCESS
. Einige Erfolge-codes zusätzliche Informationen über den Ausgang der operation, obwohl im moment kann ich nur denkenS_FALSE
, die Sie informiert den Anrufer, dass der Vorgang erfolgreich war, aber das Ergebnis war falsch. Als eine Regel, Erfolg die codes sind gleich oder größer als null ist, und Fehler-codes sind weniger als null.[Genaugenommen
S_FALSE
ist einHRESULT
, nicht einNT_STATUS
, obwohl die beiden Typen haben die gleiche Größe und ähnliche Konventionen.]InformationsquelleAutor JSBձոգչ
__Erfolg ist schön beschrieben hier.
Antwort zu 2 ist Nicht alle positiven codes sind nicht-Ausfälle. Sie können etwas anderes bedeuten als OK obwohl.
InformationsquelleAutor Mark Hurd