2010-08-30 15 views
7

मैं एक बहुत googled और मैं इस समस्या के लिए किसी भी सवाल का जवाब नहीं मिला ...WriteFile त्रुटि # 5 जीत विस्टा/के अंतर्गत "पहुंच अस्वीकृत" सात

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

मैंने कुछ पोस्ट में पढ़ा है कि "विंडोज विस्टा आपको उपयोगकर्ता-मोड प्रक्रियाओं से डिस्क तक पहुंचने की अनुमति नहीं देता है। क्या किसी को इस व्यवहार को छोड़ने के किसी भी तरीके के बारे में पता है?

मैं एक समाधान में काम कर रहा हूँ लेकिन मैं जानना चाहूंगा कि अगर यह असंभव है या नहीं

संपादित करें:

यह मेरा पहला यहाँ पोस्ट तो मैं काफी के बारे में समझ में नहीं आता है मुद्दा जोड़ने ... लेकिन मैं किसी भी स्पैम के लिए reated नहीं कर रहा हूँ ... बस एक comunity संचालित साइट :)

कोड

hDevice = CreateFile(buffer,GENERIC_READ | GENERIC_WRITE, 
     FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL); 
तरह लग रहा है में पूछ

फिर मैंने एसडी से बीटीबी जानकारी पढ़ी और फ़ाइल को देखने और अनुचित रूप से बंद फ़ाइल को पढ़ा।

अंत में जब एसडी

WriteFile(hDevice,buffer,SD_SECTOR_SIZE, &temp, 0) 

मैं एक प्रवेश निषेध पाने के लिए लिखने की कोशिश कर (त्रुटि # 5)

CreateFile (पर स्ट्रिंग) \ है \ छ:। छ पत्र के रूप में अनुरूप मेरी मशीन पर एसडी कार्ड के लिए। यह सब ठीक काम करता है और जैसा कि मैंने XP पर woks से पहले कहा था। मैंने इसका उपयोग करने का भी प्रयास किया: FSCTL_LOCK_VOLUME के ​​साथ DeviceIoControl लेकिन यह एक mem गलती त्रुटि देता है।

आशा यह किसी भी मदद के लिए समझने के लिए और धन्यवाद करने के लिए मदद करता है

+1

के +1: - और कैसे कर सकता है उपयोगिताओं "एक समाधान में काम कर रहे" ... – Chubsdad

+0

वहाँ विस्टा/सात से कच्चे डिस्क फाइल पहुंचने का एक तरीका हो गया है लिनक्स बूट यूएसबी स्टिक तैयार करने के लिए अपने बूटलोडर स्थापित करें? – bdonlan

+0

@andy, क्या आप कुछ उदाहरण कोड पोस्ट कर सकते हैं जो दिखा रहा है कि आप क्या कर रहे हैं ताकि हम देख सकें कि क्या गलत हो सकता है? – bdonlan

उत्तर

2

मुझे लगता है कि इस पथ स्ट्रिंग "बफ़र" की वजह से है; मैं एक ही मुद्दे में भाग गया। जिस डिवाइस का उपयोग आप डिवाइस एक्सेस प्राप्त करने के लिए कर रहे हैं उसे इस "\\। \ PhysicalDrive% d" % d को ड्राइव की दशमलव संख्या पसंद है।

इस स्ट्रिंग पर Vista से CASE SENSITIVE है। वर्तनी जांचें। आपको XP में पहले की तरह व्यवस्थापक अधिकारों की भी आवश्यकता है।

वॉल्यूम्स के लिए। पत्र को उदाहरण के लिए आवश्यक है "\\। \ G:"

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

इसके अलावा: मैं यह उल्लेख करना भूल गया कि डेटा को पढ़ने/लिखने वाले बफर पृष्ठ को गठबंधन किया जाना चाहिए और क्षेत्र के आकार के एक से अधिक को पढ़ना चाहिए। वर्चुअलअलोक() यह

+1

धन्यवाद आपके संपादन के लिए बाल्फा! धन्यवाद आपके उत्तर के लिए डोमिनिक :) मुझे लगता है कि CreateFile में lpFileName के लिए सिंटैक्स हमेशा \\। \ के साथ शुरू होता है जैसा कि http://msdn.microsoft.com/en-us/library/aa363858%28VS.85 में उल्लेख किया गया है % 29.aspx ऐसा लगता है कि वॉल्यूम पत्र को कैपिटल करना मेरे मामले में बिल्कुल मदद नहीं करता है। मैंने \\। \ PhysicalDriveXX (मेरे मामले में XX 1 होने का भी प्रयास किया) लेकिन बाद में रीडफ़ाइल (एचडीवीस, inf_buffer, SD_SECTOR_SIZE, और tmp, 0) पर भी कोशिश की; inf_buffer में कुछ भी नहीं देता है लेकिन एक खाली है। हालांकि CreateFile बिल्कुल शिकायत नहीं कर रहा है। एमएस वीसी ++ 6 (देव मशीन) – andy

+0

के साथ XP पर डीबगिंग के तहत किया गया यह अंतिम परीक्षण धन्यवाद एंडी - जिस मार्ग में मैंने प्रवेश किया है, उसके दो स्लेश थे, लेकिन स्लैश एक बचने वाला चार है, इसलिए आपको वास्तव में दो प्राप्त करने के लिए चार दर्ज करना होगा । मैंने बफर संरेखण के बारे में कुछ भी याद किया है। यदि आप फ़ाइल खोल सकते हैं तो नाम और अनुमतियां सही हैं, अगर पढ़ विफल हो जाती है, तो यह बफर आकार/संरेखण और/या "लॉकिंग" है। मुझे लगता है कि जब आप लिखना चाहते हैं तो लॉकिंग अधिक महत्वपूर्ण है। –

0

कच्चे डेटा को लिखने से पहले आपको वॉल्यूम को खाली करना होगा।

MSDN से

:

यदि मात्रा एक घुड़सवार फाइल सिस्टम नहीं है एक मात्रा संभाल पर एक लिखने सफल होगा, या अगर निम्न स्थितियों में से एक सत्य है:

  • क्षेत्रों बूट क्षेत्रों के लिए लिखा जाना है।
  • सिस्टम सिस्टम फ़ाइल के बाहर रहने के लिए क्षेत्र को लिखा जाना चाहिए।
  • आपने FSCTL_LOCK_VOLUME या FSCTL_DISMOUNT_VOLUME का उपयोग कर वॉल्यूम को स्पष्ट रूप से लॉक या डिसमउंट किया है।
  • वॉल्यूम में कोई वास्तविक फ़ाइल सिस्टम नहीं है। (दूसरे शब्दों में, यह एक रॉ फाइल सिस्टम घुड़सवार है।)

एक डिस्क हैंडल पर एक लिखने सफल होगा यदि निम्न स्थितियों में से एक सत्य है:

  • क्षेत्रों करने के लिए लिखे जाने की वॉल्यूम के विस्तार के भीतर नहीं आते हैं।
  • क्षेत्रों को आरोहित वॉल्यूम के भीतर गिरने के लिए लिखा जाना है, लेकिन आपने FSCTL_LOCK_VOLUME या FSCTL_DISMOUNT_VOLUME का उपयोग कर वॉल्यूम को स्पष्ट रूप से लॉक या डिसमउंट किया है।
  • क्षेत्रों को उस वॉल्यूम के भीतर गिरने के लिए लिखा जाना चाहिए जिसमें रॉ के अलावा कोई घुड़सवार फ़ाइल सिस्टम नहीं है।

Sample code:

BOOL bResult = DeviceIoControl(hDevice,    // device to be queried 
           FSCTL_DISMOUNT_VOLUME, // operation to perform 
           NULL, 0,    // no input buffer 
           pdg, sizeof(*pdg),  // output buffer 
           &junk,     // # of bytes returned 
           (LPOVERLAPPED)NULL); // synchronous I/O 
+5

हमेशा अपने उत्तर में प्रासंगिक एमएसडीएन लेख/दस्तावेज में * लिंक * शामिल करें। –

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