2010-07-31 11 views
5

दो सवाल:विंडोज एनडीके में "एनटीएसटीएटीयूएस", "NT_SUCCESS" टाइपपीफ को कैसे समझें?

1.

"ntdef.h" NTSTATUS में इस प्रकार परिभाषित किया गया है:

typedef __success(return >= 0) LONG NTSTATUS; 

क्या नरक "__success है (वापसी> = 0) "?

2.

"ntstatus.h" में, 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 का उत्तर नहीं है, सभी सकारात्मक कोड असफल नहीं हैं। हालांकि वे ठीक से कुछ और मतलब हो सकता है।

3

टुकड़ा __success(return >= 0) एक एसएएल एनोटेशन है, जो मैक्रो के इच्छित अर्थशास्त्र के बारे में प्रीफास्ट टूल के लिए एक सुराग देता है। इसका उपयोग स्थिर विश्लेषण करने और संभावित बग की पहचान करने के लिए किया जाता है।

NT_SUCCESS>= 0 के लिए मैक्रो परीक्षण क्योंकि STATUS_SUCCESS के अलावा सफलता कोड हैं। कुछ सफलता कोडों में ऑपरेशन के नतीजे के बारे में अतिरिक्त जानकारी शामिल है, हालांकि फिलहाल मैं केवल S_FALSE के बारे में सोच सकता हूं, जो कॉलर को सूचित करता है कि ऑपरेशन सफल हुआ, लेकिन परिणाम गलत था। एक नियम के रूप में, सफलता कोड शून्य से बराबर या उससे अधिक होते हैं, और विफलता कोड शून्य से कम होते हैं।

[सच पूछिये तो, S_FALSE एक HRESULT, न कि एक NT_STATUS है, हालांकि दो प्रकार के एक ही आकार और इसी तरह के सम्मेलनों की है।]

संबंधित मुद्दे