2010-07-31 3 views
5

두 질문 :Windows ddk에서 "NTSTATUS", "NT_SUCCESS"typedef를 이해하는 방법은 무엇입니까?

"ntdef.h"는 NTSTATUS 1.

는 다음과 같이 정의된다 :

typedef __success(return >= 0) LONG NTSTATUS; 

도대체 무슨 일이 "__success입니다 (> = 0 반환) "? "으로 Ntstatus.h"의

2.

, STATUS_SUCCESS 0

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

에 정의되어 있지만 "ntdef.h"의 NT_SUCCESS 매크로이다

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

"상태 == 0"이 아니어야합니까?

답변

10

__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_SUCCESSSTATUS_SUCCESS (0)에 대해 엄격한 테스트를하지 않는 이유는 아마 STATUS_PENDING 같은 다른 코드는 실제로 실패하지 않은 것입니다.

1

__success는 here으로 잘 설명됩니다.

2로 대답은 아니오, 모든 긍정적 인 코드는 오류가 아닙니다. 그들은 OK 이외의 다른 것을 의미 할 수도 있습니다.

3

조각 __success(return >= 0)은 매크로의 의도 된 의미에 대해 PreFast 도구에 대한 단서를 제공하는 SAL 주석입니다. 이것은 정적 분석을 수행하고 잠재적 인 버그를 식별하는 데 사용됩니다.

STATUS_SUCCESS 이외의 성공 코드가 있기 때문에 >= 0에 대한 NT_SUCCESS 매크로 테스트 매크로를 테스트합니다. 일부 성공 코드에는 작업 결과에 대한 추가 정보가 포함되어 있지만 현재 호출자에게 작업이 성공했음을 알리는 결과가 false 인 경우에만 S_FALSE을 생각할 수 있습니다. 원칙적으로 성공 코드는 0 이상이고 실패 코드는 0보다 작습니다.

[두 종류가 동일한 크기와 유사한 규칙이 비록 엄밀히 S_FALSEHRESULT 아닌 NT_STATUS이다 말하기.]

관련 문제