Comment comprendre le “NTSTATUS”, “NT_SUCCESS” typedef dans le kit ddk de windows?
Deux questions:
1.
Dans "ntdef.h" la NTSTATUS est défini comme suit:
typedef __success(return >= 0) LONG NTSTATUS;
ce que l'enfer est le "__la réussite(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)
Ne devrait-elle pas être "Status == 0" ?
Vous devez vous connecter pour publier un commentaire.
__la réussite est une Avancée "Annotation" défini dans SpecStrings_strict.h, qui la définit comme suit.
La raison que
NT_SUCCESS
ne pas faire un essai strict contreSTATUS_SUCCESS (0)
est probablement que d'autres codes commeSTATUS_PENDING
ne sont pas réellement des échecs.Le fragment
__success(return >= 0)
est un SAL annotation, ce qui donne une idée de la PreFast outil au sujet de ce que la destinée de la sémantique de la macro sont. Il est utilisé pour faire de l'analyse statique et d'identifier d'éventuels bugs.La
NT_SUCCESS
macro tests pour>= 0
parce qu'il y a de la réussite des codes autres queSTATUS_SUCCESS
. Certains codes de réussite inclure 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 les 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 succès est égal ou supérieur à zéro, et les codes de panne sont inférieures à zéro.[À proprement parler,
S_FALSE
est unHRESULT
, pas unNT_STATUS
, bien que les deux types ont la même taille et de même des conventions similaires.]__la réussite est décrit joliment morts-lien.
Réponse à 2 N'est, positive dans tous les codes sont non-échecs. Ils peuvent signifier autre chose que OK, bien.