2011-01-22 13 views
7

मूल एपीआई में माइक्रोसॉफ्ट प्रत्येक एपीआई कॉल के दो संस्करण निर्यात करता है, जो ज़ेड के साथ प्रीफिक्स्ड और एनटी के साथ एक है, उदाहरण के लिए। ZwCreate थ्रेड और एनटीक्रेट थ्रेड।विंडोज मूल एपीआई: ज़ेड बनाम एनटी प्रीफिक्स्ड एपीआई कॉल का उपयोग कब और क्यों करें?

मेरा प्रश्न यह है कि कॉल के उन दो संस्करणों के बीच क्या अंतर है और कब और क्यों ज़ेड या एनटी का उपयोग करना चाहिए? मेरी समझ के लिए ज़ेड संस्करण यह सुनिश्चित करता है कि कॉलर कर्नेल मोड में रहता है, जबकि एनटी नहीं करता है।

मैं ज़ेड और एनटी उपसर्ग/संक्षेप के लिए विशिष्ट अर्थ के बारे में भी सोच रहा हूं? कोई अनुमान लगा सकता है कि एनटी शायद एनटी (नई तकनीक) विंडोज परिवार या मूल (शायद नहीं) को संदर्भित करता है? ज़ेड के लिए, क्या यह कुछ के लिए खड़ा है?

उत्तर

8

Using Nt and Zw Versions of the Native System Services Routines देखें।

एक कर्नेल-मोड ड्राइवर एक मूलभूत सिस्टम सेवा दिनचर्या के ज़ेड संस्करण को कॉल करता है ताकि पैरामीटर एक विश्वसनीय, कर्नेल-मोड स्रोत से आने वाले दिनचर्या को सूचित किया जा सके। इस मामले में, नियमित रूप से मानता है कि यह पहले मान्य किए बिना पैरामीटर का सुरक्षित रूप से उपयोग कर सकता है। हालांकि, यदि पैरामीटर या तो उपयोगकर्ता-मोड स्रोत या कर्नेल-मोड स्रोत से हो सकते हैं, तो ड्राइवर इसके बजाय नियमित रूप से एनटी संस्करण को कॉल करता है, जो कॉलिंग थ्रेड के इतिहास के आधार पर निर्धारित करता है, चाहे उपयोगकर्ता में उत्पन्न पैरामीटर मोड या कर्नेल मोड।

मूल प्रणाली सेवाएं दिनचर्या उन्हें प्राप्त पैरामीटर के बारे में अतिरिक्त धारणाएं बनाती हैं। यदि किसी दिनचर्या को कर्नेल-मोड ड्राइवर द्वारा आवंटित किए गए बफर को पॉइंटर प्राप्त होता है, तो नियमित रूप से मानता है कि बफर को सिस्टम मेमोरी में आवंटित किया गया था, न कि उपयोगकर्ता-मोड मेमोरी में। यदि दिनचर्या को एक उपयोगकर्ता-मोड एप्लिकेशन द्वारा खोला गया एक संभाल प्राप्त होता है, तो नियमित रूप से उपयोगकर्ता-मोड हैंडल तालिका में हैंडल की तलाश करता है, कर्नेल-मोड हैंडल तालिका में नहीं।

इसके अलावा, Zw कुछ भी नहीं खड़ा है। देखें What Does the Zw Prefix Mean?:

विंडोज मूल प्रणाली सेवाओं के दिनचर्या में ऐसे नाम होते हैं जो उपसर्ग एनटी और जेड के साथ शुरू होते हैं। एनटी उपसर्ग विंडोज एनटी का संक्षेप है, लेकिन ज़ेड उपसर्ग का कोई मतलब नहीं है। ज़ेड को अन्य एपीआई के साथ संभावित नामकरण विवादों से बचने के लिए आंशिक रूप से चुना गया था, और आंशिक रूप से भविष्य में किसी संभावित संभावित दो-अक्षर उपसर्गों का उपयोग करने से बचने के लिए।

+2

अजीब बात है - हम आधार है कि हम नहीं चाहते थे कि पर एक महत्वपूर्ण एपीआई के लिए एपीआई उपसर्ग चुना एक उपसर्ग का उपयोग करने के लिए जिसका उपयोग भविष्य में कुछ महत्वपूर्ण के लिए किया जा सकता है। –

+0

@ब्लैंक: अच्छा, यह मजाकिया है, लेकिन फिर, मैं किसी भी बेहतर विकल्प के बारे में नहीं सोच सकता। : \ – Mehrdad

8

मैं Merhdad के जवाब पर एक टिप्पणी के रूप में इस छोड़ने के लिए जा रहा था, लेकिन यह बहुत लंबा हो गया ...

Mehrdad के जवाब 100% सही है। यह भी थोड़ा भ्रामक है। "PreviousMode" लेख "एनटी और जेडब्लू का उपयोग ..." लेख से जुड़ा हुआ लेख मेहदद इसमें अधिक विस्तार से जाता है। पैराफ्रेशिंग: एनटी और जेडब्ल्यू एपीआई कॉल के बीच प्राथमिक अंतर यह है कि ज़ेड कॉल सिस्टम कॉल प्रेषक के माध्यम से जाते हैं, लेकिन ड्राइवरों के लिए, एनटी कॉल एपीआई को सीधी कॉल हैं।

जब कोई ड्राइवर ज़ेड एपीआई कहता है, तो सिस्टम कॉल प्रेषक के माध्यम से चलने का एकमात्र वास्तविक प्रभाव यह है कि यह उपयोगकर्ता मोड के बजाय केजीनेटप्रिडमोड() को कर्नेलमोड में सेट करता है (जाहिर है कि उपयोगकर्ता मोड कोड, ज़ेड और एनटी फॉर्म समान हैं) । जब विभिन्न सिस्टम कॉल देखते हैं कि ExGetPreviousMode कर्नेलमोड है, तो वे एक्सेस जांच को बाईपास करते हैं (क्योंकि ड्राइवर कुछ भी कर सकते हैं)।

यदि कोई ड्राइवर एपीआई के एनटी फॉर्म को कॉल करता है, तो यह संभव है कि एक्सेस एक्सेस के कारण यह विफल हो जाए।

एक ठोस उदाहरण: यदि कोई ड्राइवर NtCreateFile को कॉल करता है, तो NtCreateFile SeAccessCheck() को कॉल करने के लिए कॉल करेगा, यह देखने के लिए कि ड्राइवर में कॉल करने वाले एप्लिकेशन को फ़ाइल बनाने की अनुमति है या नहीं। यदि ZwCreateFile नामक वही ड्राइवर है, तो NtCreateFile API कॉल SeAccessCheck को कॉल नहीं करेगा क्योंकि ExGetPreviousMode ने कर्नेलमोड वापस कर दिया है और इस प्रकार ड्राइवर को फ़ाइल तक पहुंच माना जाता है।

यह महत्वपूर्ण चालक लेखकों दोनों के बीच अंतर को समझने के लिए है, क्योंकि यह सुरक्षा पर गहरा प्रभाव हो सकता है ...

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