2010-11-30 36 views
7

वर्तमान में हम WriteFile पर कॉल की समस्या का सामना करते हैं (या, बल्कि CFile :: लिखें - लेकिन यह केवल आंतरिक रूप से WriteFile को कॉल करता है) Win32 त्रुटि 5ERROR_ACCESS_DENIED उत्पन्न करता है।WriteFile को ERROR_ACCESS_DENIED वापस करने का क्या कारण बनता है?

(संपादित करें:।! ध्यान दें कि हम व्यवहार repro नहीं कर सकते हैं सभी हम इस समय एक लॉगफ़ाइल स्रोत लाइन जहां CFile :: लिखें था यह दर्शाता है और त्रुटि ERROR_ACCESS_DENIED रूप युक्त)

(संपादित करें : फ़ाइल एक स्थानीय ड्राइव पर है और यह वास्तव में एक फ़ाइल और एक निर्देशिका नहीं है)

अब, WriteFiles's documentation वास्तव में मदद नहीं करता है, और एक साधारण परीक्षण-ऐप के साथ प्रयोग निम्नलिखित परिणाम प्राप्त होते हैं:।

  1. WriteFile कारण ERROR_ACCESS_DENIED को फ़ाइल फ़ाइल हैंडल के लिए बुलाया जाता है जो लिखने के लिए खोला नहीं जाता है (यानी। केवल पढ़ने के लिए खोला गया है)।
  2. यह नहीं कारण ERROR_ACCESS_DENIED जाएगा अगर
    • संभाल मान्य नहीं है या फ़ाइल बिल्कुल
    • पहुँच अधिकार, या लिखने संरक्षित झंडा फ़ाइल के लिए खुला नहीं है के बाद संशोधित किया गया है, इस प्रक्रिया को फ़ाइल द्वारा खोला गया है। (इन से पहले संशोधित रहे हैं, तो फ़ाइल को खोला जाता है, तो हम कभी नहीं WriteFile को मिलता है क्योंकि फ़ाइल खोलने असफल हो जायेगी।)
    • फ़ाइल किसी भी तरह किसी अन्य प्रक्रिया/संभाल द्वारा अवरोधित किया गया है (यह होगा सबसे अच्छा परिणाम में त्रुटि में 32 ERROR_SHARING_VIOLATION)।

स्थिति, कि जाहिरा तौर पर इस कॉल के लिए केवल संभावना है, तो फ़ाइल वास्तव में पढ़ने ध्वज के बजाय लिखने ध्वज के साथ खोला गया था विफल साथ हमें छोड़ देता है। हालांकि, हमारे कोड को देखते हुए, यह बेहद असंभव लगता है। (हमारे ट्रेसिंग, के कारण हम सुनिश्चित करें कि WriteFile में विफल रहा है हो सकता है और हम सुनिश्चित करें कि त्रुटि ERROR_ACCESS_DENIED है हो सकता है, हम नहीं खोलने झंडे के 100.1% यकीन है, हो सकता है क्योंकि इन बाहर का पता नहीं कर रहे हैं।)

क्या कोई अन्य ज्ञात परिस्थितियां हैं जहां WriteFile (CFile :: Write) एक ERROR_ACCESS_DENIED का कारण बनती है?

नोट:

  • फ़ाइल
  • सभी परीक्षणों मैं प्रदर्शन किया है कि जब तक संकेत मिलता है खुला किया गया था, इसलिए यह एक निर्देशिका नहीं हो या somesuch कर सकते हैं: अतिरिक्त इस सवाल के संदर्भ स्पष्ट करने के लिए फ़ाइल खुलती है इसे हटाया नहीं जा सकता है, इसलिए फ़ाइल अभी भी WriteFile
  • पर कॉल पर मौजूद होना चाहिए फ़ाइल स्थानीय ड्राइव पर स्थित है, न कि नेटवर्क ड्राइव पर।

मुझे लगता है कि हम Windows XP SP3 पर चला रहे हैं और एप्लिकेशन को विजुअल स्टूडियो 2005

+1

आप उद्घाटन झंडे क्यों नहीं पता लगा सकते हैं? यदि आप कोड को संपादित नहीं करना चाहते हैं, तो बस निरीक्षण करने के लिए प्रक्रिया मॉनीटर का उपयोग करें। –

+0

निश्चित रूप से हम ट्रेसिंग जोड़ सकते हैं। यह केवल एक ग्राहक साइट पर थोड़ी देर में होता है। कोई रास्ता नहीं है कि हम वहां एक डीबगर जोड़ने में सक्षम होंगे। –

+1

फ़ाइल सिस्टम फ़िल्टर ड्राइवर भी इसका कारण बन सकते हैं, एंटी-वायरस स्कैनर होने का सबसे स्पष्ट उदाहरण (हालांकि एन्क्रिप्शन जैसे अन्य लोग हैं)। – Luke

उत्तर

3

सवाल

क्या WriteFile ERROR_ACCESS_DENIED वापस जाने के लिए कारण बनता है क्या था?

और अगर यह एक फ़ाइल हैंडल कि लिखने के लिए खोला नहीं है (यानी केवल पढ़ने के लिए खोला जाता है) के लिए कहा जाता है मैं सवाल

  1. WriteFile ERROR_ACCESS_DENIED कारण होगा में कहा गया है ।

खुला झंडे और एक अन्य घटना के लिए आगे लॉगिंग जोड़ने के बाद, यह पता चला है यह सही था। खुले झंडे के लिए लॉगिंग से पता चलता है कि त्रुटि के बिंदु पर, फाइल ऑब्जेक्ट को CFile :: modeRead के साथ खोला गया था और इसलिए हमें ERROR_ACCESS_DENIED मिला।

अभी तक पता नहीं चला है कि कौन सा अजीब कोड पथ इसका कारण बनता है, लेकिन यह केवल दिखाता है: कभी भी अपने कोड पर भरोसा न करें। :-)

(ओह, और btw। यह ::WriteFile कि विफल नहीं था, लेकिन ::FlushFileBuffers एपीआई, लेकिन जाहिरा तौर पर है कि एक ही त्रुटि देता है।)

+0

यदि यह आपके अपने प्रश्न का उत्तर देता है, तो कृपया इसे इस तरह चिह्नित करें। – RedX

+0

@RedX: धन्यवाद। ऐसा तुरंत नहीं किया, क्योंकि मैंने सोचा था कि एक निश्चित समय के लिए स्वयं-जवाब बंद कर दिए गए थे। ऐसा लगता है कि यह प्रश्न की उम्र पर लागू होता है, हालांकि उत्तर के नहीं। –

0

साथ संकलित किया गया है, यदि आप इसे डीबग कर सकते हैं, तो आप चाहिए जोड़ना चाहिए। यह एक लाख हो सकते हैं:

  • MSDN गलत है (ऐसा होता है एक बहुत)
  • कुछ एप्लिकेशन (वायरस?) WriteFile hooking और अलग व्यवहार
  • फाइल सिस्टम समस्या का कारण है?
  • कुछ गलत अपने प्रवेश करने में, या टिप्पणियों
+2

आईएमएचओ, यह एक टिप्पणी होनी चाहिए थी।इस समय समस्या को डीबग करना संभव नहीं है। –

1

लगभग एक दर्जन विभिन्न स्थितियां हैं जिनके परिणामस्वरूप ERROR_ACCESS_DENIED हो सकता है। आंतरिक रूप से, सभी WriteFile को NtWriteFile पर कॉल किया जाता है और कम अर्थपूर्ण HRESULT में अपने (कुछ हद तक सार्थक) NTSTATUS त्रुटि कोड को मानचित्रित करता है।

अन्य चीजों के अलावा, ERROR_ACCESS_DENIED इंगित कर सकता है कि फ़ाइल नेटवर्क वॉल्यूम पर है और कुछ लिखने की अनुमति के साथ कुछ गलत हो गया है, या फ़ाइल वास्तव में एक फ़ाइल नहीं है बल्कि एक निर्देशिका है।

+0

फ़ाइल नेटवर्क वॉल्यूम पर नहीं है और यह वास्तव में एक फ़ाइल है। –

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