2008-09-18 14 views
22

मैं कुछ कोड है जो सफाई से संकलित जोड़ लिया है और सिर्फ इस Windows त्रुटि प्राप्त हुआ है:एक विशेषाधिकार प्राप्त निर्देश क्या है?

--------------------------- 
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error 
--------------------------- 
The exception Privileged instruction. 

(0xc0000096) occurred in the application at location 0x00486752. 

मैं के बारे में एक बग की खोज पर जाने के लिए कर रहा हूँ, और मैं इसे कुछ मूर्खतापूर्ण है कि मैंने किया है होना करने के लिए उम्मीद कर रहा हूँ जो सिर्फ इस संदेश का उत्पादन होता है। कोड त्रुटियों या चेतावनियों के साथ स्पष्ट रूप से संकलित करता है। EXE फ़ाइल का आकार 1,454,132 बाइट्स तक बढ़ गया है और इसमें ODCS.lib के लिंक शामिल हैं, लेकिन यह अन्यथा Win32 API के लिए शुद्ध सी है, DEBUG पर (विंडोज   2000 पर पी 4 पर चल रहा है) के साथ।

उत्तर

29

प्रश्न का उत्तर देने के लिए, एक विशेषाधिकार प्राप्त निर्देश एक प्रोसेसर ओप-कोड (असेंबलर निर्देश) है जिसे केवल "पर्यवेक्षक" (या रिंग -0) मोड में निष्पादित किया जा सकता है। इन प्रकार के निर्देशों का उपयोग I/O डिवाइसों और विंडोज कर्नेल से संरक्षित डेटा संरचनाओं तक पहुंचने के लिए किया जाता है।

नियमित कार्यक्रमों "यूजर मोड" (रिंग 3) जो मैं/हे उपकरणों, आदि के लिए सीधी पहुँच की अनुमति नहीं देता ...

दूसरों के रूप में उल्लेख किया है, कारण शायद एक भ्रष्ट ढेर या एक में गड़बड़ है पर अमल फ़ंक्शन पॉइंटर कॉल।

2

मैं वर्ष 2000

डिबग सी ++ पुस्तकालय उस में शारीरिक आई/ओ निर्देश के लिए कॉल किया था, अपवाद संचालक में में दृश्य सी के साथ इस ++ 6.0 देखा। यदि मुझे सही तरीके से याद है, तो यह एक आई/ओ बंदरगाह पर डंपिंग स्थिति थी जो डीएमए बेस रजिस्टरों के लिए होता था, जो मुझे लगता है कि माइक्रोसॉफ्ट में कोई डीबगर कार्ड के लिए उपयोग कर रहा था।

कुछ त्रुटि स्थिति की तलाश करें जो डायग्नोस्टिक्स कोड को चलाने के लिए गुप्त हो सकती है।

मैं डिबगिंग, बैकट्रैक और असंतुलन को पढ़ रहा था। यह std::string प्रसंस्करण करते समय एक अपवाद था, शायद अंत से अनुक्रमणित हो रहा है।

+0

यह वास्तव में वीसी 6 है। लेकिन सी ++ नहीं, हालांकि बहुत सारे शून्य समाप्त तारों। (मैं नए कंपाइलर्स का उपयोग कर सकता हूं लेकिन अफवाहें सुना है कि वीसी 6 वास्तव में सी ++ की बजाय सी के लिए तेज़ है)। मुझे संदेह है कि यह एक कंपाइलर बग है हालांकि ... (मुझे हमेशा पता चलता है कि यह उनमें से एक है - "मैं क्या सोच रहा था" क्षण)। –

7

इस तरह की चीज आम तौर पर तब होती है जब फ़ंक्शन पॉइंटर्स का उपयोग करते हैं जो अमान्य डेटा को इंगित करते हैं। यह भी हो सकता है यदि आपके पास कोड है जो आपके रिटर्न स्टैक को ट्रैश करता है। कभी-कभी इन प्रकार की बगों को ट्रैक करने में काफी मुश्किल हो सकती है क्योंकि उन्हें आम तौर पर पुन: पेश करना कठिन होता है।

4

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

6

एक विशेषाधिकार प्राप्त निर्देश एक आईए -32 निर्देश है जिसे केवल रिंग -0 (यानी कर्नेल मोड) में निष्पादित करने की अनुमति है। यदि आप इसे उपयोगकर्ता स्पेस में मार रहे हैं, तो आपको या तो वास्तव में पुरानी EXE, या दूषित बाइनरी मिल गई है।

+0

exe ​​मैंने 10 सेकंड पहले वीसी 6 का उपयोग करके संकलित किया .... लेकिन इसमें ओडीबीसी.एलबीबी और अन्य libs के लिंक शामिल हैं जो काफी पुराने हो सकते हैं। यह ऐप ड्राइवर या सेवा नहीं है। –

2

त्रुटि स्थान 0x00486752 वास्तव में मेरे लिए वास्तव में छोटा लगता है, जहां निष्पादन योग्य कोड आमतौर पर रहता है। मैं डैनियल से सहमत हूं, यह मेरे लिए एक जंगली सूचक की तरह दिखता है।

3

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

जैसा कि यह निकला, मैंने अभी एक बटन जोड़ा था जो कुछ टूल बार बटन जानकारी (जो स्टैक पर था) रखने वाले सरणी के अधिकतम आकार में चला गया था। मैं भूल गया था कि

 
#define MAX_NUM_TOOBAR_BUTTONS (24) 

यहां तक ​​कि अस्तित्व में था!

2

पिछले 15 वर्षों में निर्मित अधिकांश प्रोसेसर के सीपीयू में कुछ विशेष निर्देश हैं जो बहुत शक्तिशाली हैं। ये विशेषाधिकार प्राप्त निर्देश ऑपरेटिंग सिस्टम कर्नेल अनुप्रयोगों के लिए रखे जाते हैं और उपयोगकर्ता लिखित प्रोग्राम द्वारा उपयोग नहीं किए जा सकते हैं।

यह उस नुकसान को प्रतिबंधित करता है जो उपयोगकर्ता द्वारा लिखित प्रोग्राम सिस्टम पर आ सकता है और सिस्टम वास्तव में क्रैश होने की संख्या को कम करता है।

2

कर्नेल मोड में निष्पादित करते समय, ऑपरेटिंग सिस्टम में कर्नेल और उपयोगकर्ता प्रोग्राम की स्मृति दोनों के लिए अप्रतिबंधित पहुंच है।

आधार और सीमा रजिस्टरों के लिए लोड निर्देश विशेषाधिकार प्राप्त निर्देश हैं।

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